Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenflush.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS kernel 00004 * FILE: drivers/fs/vfat/flush.c 00005 * PURPOSE: VFAT Filesystem 00006 * PROGRAMMER: 00007 */ 00008 00009 /* INCLUDES *****************************************************************/ 00010 00011 #define NDEBUG 00012 #include "vfat.h" 00013 00014 /* FUNCTIONS ****************************************************************/ 00015 00016 static NTSTATUS VfatFlushFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb) 00017 { 00018 IO_STATUS_BLOCK IoStatus; 00019 NTSTATUS Status; 00020 00021 DPRINT("VfatFlushFile(DeviceExt %p, Fcb %p) for '%wZ'\n", DeviceExt, Fcb, &Fcb->PathNameU); 00022 00023 CcFlushCache(&Fcb->SectionObjectPointers, NULL, 0, &IoStatus); 00024 if (IoStatus.Status == STATUS_INVALID_PARAMETER) 00025 { 00026 /* FIXME: Caching was possible not initialized */ 00027 IoStatus.Status = STATUS_SUCCESS; 00028 } 00029 if (Fcb->Flags & FCB_IS_DIRTY) 00030 { 00031 Status = VfatUpdateEntry(Fcb); 00032 if (!NT_SUCCESS(Status)) 00033 { 00034 IoStatus.Status = Status; 00035 } 00036 } 00037 return IoStatus.Status; 00038 } 00039 00040 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb) 00041 { 00042 PLIST_ENTRY ListEntry; 00043 PVFATFCB Fcb; 00044 NTSTATUS Status, ReturnStatus = STATUS_SUCCESS; 00045 00046 DPRINT("VfatFlushVolume(DeviceExt %p, FatFcb %p)\n", DeviceExt, VolumeFcb); 00047 00048 ListEntry = DeviceExt->FcbListHead.Flink; 00049 while (ListEntry != &DeviceExt->FcbListHead) 00050 { 00051 Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry); 00052 ListEntry = ListEntry->Flink; 00053 if (!vfatFCBIsDirectory(Fcb)) 00054 { 00055 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE); 00056 Status = VfatFlushFile(DeviceExt, Fcb); 00057 ExReleaseResourceLite (&Fcb->MainResource); 00058 if (!NT_SUCCESS(Status)) 00059 { 00060 DPRINT1("VfatFlushFile failed, status = %x\n", Status); 00061 ReturnStatus = Status; 00062 } 00063 } 00064 /* FIXME: Stop flushing if this is a removable media and the media was removed */ 00065 } 00066 ListEntry = DeviceExt->FcbListHead.Flink; 00067 while (ListEntry != &DeviceExt->FcbListHead) 00068 { 00069 Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry); 00070 ListEntry = ListEntry->Flink; 00071 if (vfatFCBIsDirectory(Fcb)) 00072 { 00073 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE); 00074 Status = VfatFlushFile(DeviceExt, Fcb); 00075 ExReleaseResourceLite (&Fcb->MainResource); 00076 if (!NT_SUCCESS(Status)) 00077 { 00078 DPRINT1("VfatFlushFile failed, status = %x\n", Status); 00079 ReturnStatus = Status; 00080 } 00081 } 00082 /* FIXME: Stop flushing if this is a removable media and the media was removed */ 00083 } 00084 00085 Fcb = (PVFATFCB) DeviceExt->FATFileObject->FsContext; 00086 00087 ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE); 00088 Status = VfatFlushFile(DeviceExt, Fcb); 00089 ExReleaseResourceLite(&DeviceExt->FatResource); 00090 00091 /* FIXME: Flush the buffers from storage device */ 00092 00093 if (!NT_SUCCESS(Status)) 00094 { 00095 DPRINT1("VfatFlushFile failed, status = %x\n", Status); 00096 ReturnStatus = Status; 00097 } 00098 00099 return ReturnStatus; 00100 } 00101 00102 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext) 00103 { 00104 NTSTATUS Status; 00105 PVFATFCB Fcb; 00106 /* 00107 * This request is not allowed on the main device object. 00108 */ 00109 if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject) 00110 { 00111 Status = STATUS_INVALID_DEVICE_REQUEST; 00112 goto ByeBye; 00113 } 00114 00115 Fcb = (PVFATFCB)IrpContext->FileObject->FsContext; 00116 ASSERT(Fcb); 00117 00118 if (Fcb->Flags & FCB_IS_VOLUME) 00119 { 00120 ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE); 00121 Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb); 00122 ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource); 00123 } 00124 else 00125 { 00126 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE); 00127 Status = VfatFlushFile(IrpContext->DeviceExt, Fcb); 00128 ExReleaseResourceLite (&Fcb->MainResource); 00129 } 00130 00131 ByeBye: 00132 IrpContext->Irp->IoStatus.Status = Status; 00133 IrpContext->Irp->IoStatus.Information = 0; 00134 IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT); 00135 VfatFreeIrpContext(IrpContext); 00136 00137 return (Status); 00138 } 00139 00140 /* EOF */ Generated on Sat May 26 2012 04:26:19 for ReactOS by
1.7.6.1
|