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 */
64 VfatGlobalData
->ShutdownStarted
= TRUE
;
66 if (DeviceObject
== VfatGlobalData
->DeviceObject
)
68 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
69 ExAcquireResourceExclusiveLite(&VfatGlobalData
->VolumeListLock
, TRUE
);
70 ListEntry
= VfatGlobalData
->VolumeListHead
.Flink
;
71 while (ListEntry
!= &VfatGlobalData
->VolumeListHead
)
73 DeviceExt
= CONTAINING_RECORD(ListEntry
, VCB
, VolumeListEntry
);
74 ListEntry
= ListEntry
->Flink
;
76 ExAcquireResourceExclusiveLite(&DeviceExt
->DirResource
, TRUE
);
77 /* It was a clean volume mounted */
78 if (DeviceExt
->VolumeFcb
->Flags
& VCB_CLEAR_DIRTY
)
80 /* So, drop the dirty bit we set */
81 if (NT_SUCCESS(SetDirtyStatus(DeviceExt
, FALSE
)))
82 DeviceExt
->VolumeFcb
->Flags
&= ~VCB_IS_DIRTY
;
85 Status
= VfatFlushVolume(DeviceExt
, DeviceExt
->VolumeFcb
);
86 if (NT_SUCCESS(Status
))
88 Status
= VfatDiskShutDown(DeviceExt
);
89 if (!NT_SUCCESS(Status
))
91 DPRINT1("VfatDiskShutDown failed, status = %x\n", Status
);
96 DPRINT1("VfatFlushVolume failed, status = %x\n", Status
);
98 ExReleaseResourceLite(&DeviceExt
->DirResource
);
100 /* FIXME: Unmount the logical volume */
102 if (!NT_SUCCESS(Status
))
103 Irp
->IoStatus
.Status
= Status
;
105 ExReleaseResourceLite(&VfatGlobalData
->VolumeListLock
);
107 /* FIXME: Free all global acquired resources */
109 Status
= Irp
->IoStatus
.Status
;
113 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
114 Status
= STATUS_INVALID_DEVICE_REQUEST
;
117 Irp
->IoStatus
.Information
= 0;
118 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
120 FsRtlExitFileSystem();