File system drivers should forward the IRP_MJ_SHUTDOWN request to underlying storage drivers. Fixes bug #504. Modified: trunk/reactos/drivers/fs/vfat/shutdown.c _____
Modified: trunk/reactos/drivers/fs/vfat/shutdown.c --- trunk/reactos/drivers/fs/vfat/shutdown.c 2005-02-16 14:01:34 UTC (rev 13593) +++ trunk/reactos/drivers/fs/vfat/shutdown.c 2005-02-16 15:27:30 UTC (rev 13594) @@ -14,6 +14,34 @@
/* FUNCTIONS ****************************************************************/
+NTSTATUS +VfatDiskShutDown(PVCB Vcb) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + IO_STATUS_BLOCK IoStatus; + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN, Vcb->StorageDevice, + NULL, 0, NULL, &Event, &IoStatus); + if (Irp) + { + Status = IoCallDriver(Vcb->StorageDevice, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + } + else + { + Status = IoStatus.Status; + } + + return Status; +} + NTSTATUS STDCALL VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -37,15 +65,24 @@
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE); Status = VfatFlushVolume(DeviceExt, DeviceExt->VolumeFcb); - ExReleaseResourceLite(&DeviceExt->DirResource); - if (!NT_SUCCESS(Status)) - { + if (NT_SUCCESS(Status)) + { + Status = VfatDiskShutDown(DeviceExt); + if (!NT_SUCCESS(Status)) + DPRINT1("VfatDiskShutDown failed, status = %x\n", Status); + } + else + { DPRINT1("VfatFlushVolume failed, status = %x\n", Status); - Irp->IoStatus.Status = Status; } + ExReleaseResourceLite(&DeviceExt->DirResource); + /* FIXME: Unmount the logical volume */ + + if (!NT_SUCCESS(Status)) + Irp->IoStatus.Status = Status; } - ExReleaseResourceLite(&VfatGlobalData->VolumeListLock); + ExReleaseResourceLite(&VfatGlobalData->VolumeListLock);
/* FIXME: Free all global acquired resources */
@@ -53,13 +90,13 @@ } else { + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Status = STATUS_INVALID_DEVICE_REQUEST; }
- Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT);
- IoCompleteRequest(Irp, IO_NO_INCREMENT); return(Status); }