2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/fs/vfat/shutdown.c
5 * PURPOSE: VFAT Filesystem
6 * PROGRAMMER: Eric Kohl
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
26 IO_STATUS_BLOCK IoStatus
;
28 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
29 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN
, Vcb
->StorageDevice
,
30 NULL
, 0, NULL
, &Event
, &IoStatus
);
33 Status
= IoCallDriver(Vcb
->StorageDevice
, Irp
);
34 if (Status
== STATUS_PENDING
)
36 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
37 Status
= IoStatus
.Status
;
42 Status
= STATUS_INSUFFICIENT_RESOURCES
;
52 PDEVICE_OBJECT DeviceObject
,
56 PLIST_ENTRY ListEntry
;
57 PDEVICE_EXTENSION DeviceExt
;
59 DPRINT("VfatShutdown(DeviceObject %p, Irp %p)\n",DeviceObject
, Irp
);
61 FsRtlEnterFileSystem();
63 /* FIXME: block new mount requests */
65 if (DeviceObject
== VfatGlobalData
->DeviceObject
)
67 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
68 ExAcquireResourceExclusiveLite(&VfatGlobalData
->VolumeListLock
, TRUE
);
69 ListEntry
= VfatGlobalData
->VolumeListHead
.Flink
;
70 while (ListEntry
!= &VfatGlobalData
->VolumeListHead
)
72 DeviceExt
= CONTAINING_RECORD(ListEntry
, VCB
, VolumeListEntry
);
73 ListEntry
= ListEntry
->Flink
;
75 ExAcquireResourceExclusiveLite(&DeviceExt
->DirResource
, TRUE
);
76 /* It was a clean volume mounted */
77 if (DeviceExt
->VolumeFcb
->Flags
& VCB_CLEAR_DIRTY
)
79 /* So, drop the dirty bit we set */
80 if (NT_SUCCESS(SetDirtyStatus(DeviceExt
, FALSE
)))
81 DeviceExt
->VolumeFcb
->Flags
&= ~VCB_IS_DIRTY
;
84 Status
= VfatFlushVolume(DeviceExt
, DeviceExt
->VolumeFcb
);
85 if (NT_SUCCESS(Status
))
87 Status
= VfatDiskShutDown(DeviceExt
);
88 if (!NT_SUCCESS(Status
))
90 DPRINT1("VfatDiskShutDown failed, status = %x\n", Status
);
95 DPRINT1("VfatFlushVolume failed, status = %x\n", Status
);
97 ExReleaseResourceLite(&DeviceExt
->DirResource
);
99 /* FIXME: Unmount the logical volume */
101 if (!NT_SUCCESS(Status
))
102 Irp
->IoStatus
.Status
= Status
;
104 ExReleaseResourceLite(&VfatGlobalData
->VolumeListLock
);
106 /* FIXME: Free all global acquired resources */
108 Status
= Irp
->IoStatus
.Status
;
112 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
113 Status
= STATUS_INVALID_DEVICE_REQUEST
;
116 Irp
->IoStatus
.Information
= 0;
117 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
119 FsRtlExitFileSystem();