Author: pschweitzer Date: Sat Nov 29 20:15:44 2014 New Revision: 65526
URL: http://svn.reactos.org/svn/reactos?rev=65526&view=rev Log: [FASTFAT] Fix a FIXME in fastfat: - Implement support for device buffers flush in VfatFlushVolume().
Unlike Windows SDK, we don't divert the current IRP to pass it to storage device. Here, we allocate a new IRP and call the device so that it flushes buffers.
Modified: trunk/reactos/drivers/filesystems/fastfat/flush.c
Modified: trunk/reactos/drivers/filesystems/fastfat/flush.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat/flush.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat/flush.c [iso-8859-1] Sat Nov 29 20:15:44 2014 @@ -52,6 +52,9 @@ PLIST_ENTRY ListEntry; PVFATFCB Fcb; NTSTATUS Status, ReturnStatus = STATUS_SUCCESS; + PIRP Irp; + KEVENT Event; + IO_STATUS_BLOCK IoStatusBlock;
DPRINT("VfatFlushVolume(DeviceExt %p, FatFcb %p)\n", DeviceExt, VolumeFcb);
@@ -99,7 +102,34 @@ Status = VfatFlushFile(DeviceExt, Fcb); ExReleaseResourceLite(&DeviceExt->FatResource);
- /* FIXME: Flush the buffers from storage device */ + /* Prepare an IRP to flush device buffers */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_FLUSH_BUFFERS, + DeviceExt->StorageDevice, + NULL, 0, NULL, &Event, + &IoStatusBlock); + if (Irp != NULL) + { + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + Status = IoCallDriver(DeviceExt->StorageDevice, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = Irp->IoStatus.Status; + } + + /* Ignore device not supporting flush operation */ + if (Status == STATUS_INVALID_DEVICE_REQUEST) + { + DPRINT1("Flush not supported, ignored\n"); + Status = STATUS_SUCCESS; + + } + } + else + { + Status = STATUS_INSUFFICIENT_RESOURCES; + }
if (!NT_SUCCESS(Status)) {