3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/fs/vfat/flush.c
6 * PURPOSE: VFAT Filesystem
7 * PROGRAMMER: Hartmut Birr
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
18 /* FUNCTIONS ****************************************************************/
20 NTSTATUS VfatFlushFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb)
22 IO_STATUS_BLOCK IoStatus;
24 DPRINT("VfatFlushFile(DeviceExt %x, Fcb %x) for '%S'\n", DeviceExt, Fcb, Fcb->PathName);
26 CcFlushCache(&Fcb->SectionObjectPointers, NULL, 0, &IoStatus);
27 if (IoStatus.Status == STATUS_INVALID_PARAMETER)
29 /* FIXME: Caching was possible not initialized */
30 IoStatus.Status = STATUS_SUCCESS;
32 return IoStatus.Status;
35 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb)
37 PLIST_ENTRY ListEntry;
40 NTSTATUS Status, ReturnStatus = STATUS_SUCCESS;
42 DPRINT("VfatFlushVolume(DeviceExt %x, FatFcb %x)\n", DeviceExt, VolumeFcb);
44 ListEntry = DeviceExt->FcbListHead.Flink;
45 while (ListEntry != &DeviceExt->FcbListHead)
47 Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry);
48 ListEntry = ListEntry->Flink;
49 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
50 Status = VfatFlushFile(DeviceExt, Fcb);
51 ExReleaseResourceLite (&Fcb->MainResource);
52 if (!NT_SUCCESS(Status))
54 DPRINT1("VfatFlushFile failed, status = %x\n", Status);
55 ReturnStatus = Status;
57 /* FIXME: Stop flushing if this a removable media and the media was removed */
60 Ccb = (PVFATCCB) DeviceExt->FATFileObject->FsContext2;
63 ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
64 Status = VfatFlushFile(DeviceExt, Fcb);
65 ExReleaseResourceLite(&DeviceExt->FatResource);
67 /* FIXME: Flush the buffers from storage device */
69 if (!NT_SUCCESS(Status))
71 DPRINT1("VfatFlushFile failed, status = %x\n", Status);
72 ReturnStatus = Status;
78 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
84 * This request is not allowed on the main device object.
86 if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
88 Status = STATUS_INVALID_DEVICE_REQUEST;
92 Ccb = (PVFATCCB) IrpContext->FileObject->FsContext2;
97 if (Fcb->Flags & FCB_IS_VOLUME)
99 ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
100 Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb);
101 ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
105 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
106 Status = VfatFlushFile(IrpContext->DeviceExt, Fcb);
107 ExReleaseResourceLite (&Fcb->MainResource);
111 IrpContext->Irp->IoStatus.Status = Status;
112 IrpContext->Irp->IoStatus.Information = 0;
113 IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
114 VfatFreeIrpContext(IrpContext);