From 8d5e230523a610c939a42462a8571f51b343d55e Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 29 Nov 2014 20:15:44 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=65526 --- reactos/drivers/filesystems/fastfat/flush.c | 32 ++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/filesystems/fastfat/flush.c b/reactos/drivers/filesystems/fastfat/flush.c index 96d6353605a..5c81cce686c 100644 --- a/reactos/drivers/filesystems/fastfat/flush.c +++ b/reactos/drivers/filesystems/fastfat/flush.c @@ -52,6 +52,9 @@ VfatFlushVolume( 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 @@ VfatFlushVolume( 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)) { -- 2.17.1