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;
39 NTSTATUS Status, ReturnStatus = STATUS_SUCCESS;
41 DPRINT("VfatFlushVolume(DeviceExt %x, FatFcb %x)\n", DeviceExt, VolumeFcb);
43 ListEntry = DeviceExt->FcbListHead.Flink;
44 while (ListEntry != &DeviceExt->FcbListHead)
46 Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry);
47 ListEntry = ListEntry->Flink;
48 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
49 Status = VfatFlushFile(DeviceExt, Fcb);
50 ExReleaseResourceLite (&Fcb->MainResource);
51 if (!NT_SUCCESS(Status))
53 DPRINT1("VfatFlushFile failed, status = %x\n", Status);
54 ReturnStatus = Status;
56 /* FIXME: Stop flushing if this is a removable media and the media was removed */
59 Fcb = (PVFATFCB) DeviceExt->FATFileObject->FsContext;
61 ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
62 Status = VfatFlushFile(DeviceExt, Fcb);
63 ExReleaseResourceLite(&DeviceExt->FatResource);
65 /* FIXME: Flush the buffers from storage device */
67 if (!NT_SUCCESS(Status))
69 DPRINT1("VfatFlushFile failed, status = %x\n", Status);
70 ReturnStatus = Status;
76 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
81 * This request is not allowed on the main device object.
83 if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
85 Status = STATUS_INVALID_DEVICE_REQUEST;
89 Fcb = (PVFATFCB)IrpContext->FileObject->FsContext;
92 if (Fcb->Flags & FCB_IS_VOLUME)
94 ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
95 Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb);
96 ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
100 ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
101 Status = VfatFlushFile(IrpContext->DeviceExt, Fcb);
102 ExReleaseResourceLite (&Fcb->MainResource);
106 IrpContext->Irp->IoStatus.Status = Status;
107 IrpContext->Irp->IoStatus.Information = 0;
108 IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
109 VfatFreeIrpContext(IrpContext);