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
= IoStatus
.Status
;
52 PDEVICE_OBJECT DeviceObject
,
56 PLIST_ENTRY ListEntry
;
57 PDEVICE_EXTENSION DeviceExt
;
60 DPRINT("VfatShutdown(DeviceObject %p, Irp %p)\n",DeviceObject
, Irp
);
62 FsRtlEnterFileSystem();
64 /* FIXME: block new mount requests */
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 if (DeviceExt
->VolumeFcb
->Flags
& VCB_CLEAR_DIRTY
)
79 /* set clean shutdown bit */
80 Status
= GetNextCluster(DeviceExt
, 1, &eocMark
);
81 if (NT_SUCCESS(Status
))
83 eocMark
|= DeviceExt
->CleanShutBitMask
;
84 if (NT_SUCCESS(WriteCluster(DeviceExt
, 1, eocMark
)))
85 DeviceExt
->VolumeFcb
->Flags
&= ~VCB_IS_DIRTY
;
89 Status
= VfatFlushVolume(DeviceExt
, DeviceExt
->VolumeFcb
);
90 if (NT_SUCCESS(Status
))
92 Status
= VfatDiskShutDown(DeviceExt
);
93 if (!NT_SUCCESS(Status
))
95 DPRINT1("VfatDiskShutDown failed, status = %x\n", Status
);
100 DPRINT1("VfatFlushVolume failed, status = %x\n", Status
);
102 ExReleaseResourceLite(&DeviceExt
->DirResource
);
104 /* FIXME: Unmount the logical volume */
106 if (!NT_SUCCESS(Status
))
107 Irp
->IoStatus
.Status
= Status
;
109 ExReleaseResourceLite(&VfatGlobalData
->VolumeListLock
);
111 /* FIXME: Free all global acquired resources */
113 Status
= Irp
->IoStatus
.Status
;
117 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
118 Status
= STATUS_INVALID_DEVICE_REQUEST
;
121 Irp
->IoStatus
.Information
= 0;
122 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
124 FsRtlExitFileSystem();