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 *****************************************************************/
14 /* FUNCTIONS ****************************************************************/
17 VfatDiskShutDown(PVCB Vcb
)
22 IO_STATUS_BLOCK IoStatus
;
24 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
25 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN
, Vcb
->StorageDevice
,
26 NULL
, 0, NULL
, &Event
, &IoStatus
);
29 Status
= IoCallDriver(Vcb
->StorageDevice
, Irp
);
30 if (Status
== STATUS_PENDING
)
32 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
33 Status
= IoStatus
.Status
;
38 Status
= IoStatus
.Status
;
45 VfatShutdown(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
48 PLIST_ENTRY ListEntry
;
49 PDEVICE_EXTENSION DeviceExt
;
52 DPRINT("VfatShutdown(DeviceObject %p, Irp %p)\n",DeviceObject
, Irp
);
54 FsRtlEnterFileSystem();
56 /* FIXME: block new mount requests */
58 if (DeviceObject
== VfatGlobalData
->DeviceObject
)
60 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
61 ExAcquireResourceExclusiveLite(&VfatGlobalData
->VolumeListLock
, TRUE
);
62 ListEntry
= VfatGlobalData
->VolumeListHead
.Flink
;
63 while (ListEntry
!= &VfatGlobalData
->VolumeListHead
)
65 DeviceExt
= CONTAINING_RECORD(ListEntry
, VCB
, VolumeListEntry
);
66 ListEntry
= ListEntry
->Flink
;
68 ExAcquireResourceExclusiveLite(&DeviceExt
->DirResource
, TRUE
);
69 if (DeviceExt
->VolumeFcb
->Flags
& VCB_CLEAR_DIRTY
)
71 /* set clean shutdown bit */
72 Status
= GetNextCluster(DeviceExt
, 1, &eocMark
);
73 if (NT_SUCCESS(Status
))
75 eocMark
|= DeviceExt
->CleanShutBitMask
;
76 if (NT_SUCCESS(WriteCluster(DeviceExt
, 1, eocMark
)))
77 DeviceExt
->VolumeFcb
->Flags
&= ~VCB_IS_DIRTY
;
80 Status
= VfatFlushVolume(DeviceExt
, DeviceExt
->VolumeFcb
);
81 if (NT_SUCCESS(Status
))
83 Status
= VfatDiskShutDown(DeviceExt
);
84 if (!NT_SUCCESS(Status
))
85 DPRINT1("VfatDiskShutDown failed, status = %x\n", Status
);
89 DPRINT1("VfatFlushVolume failed, status = %x\n", Status
);
91 ExReleaseResourceLite(&DeviceExt
->DirResource
);
93 /* FIXME: Unmount the logical volume */
95 if (!NT_SUCCESS(Status
))
96 Irp
->IoStatus
.Status
= Status
;
98 ExReleaseResourceLite(&VfatGlobalData
->VolumeListLock
);
100 /* FIXME: Free all global acquired resources */
102 Status
= Irp
->IoStatus
.Status
;
106 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
107 Status
= STATUS_INVALID_DEVICE_REQUEST
;
110 Irp
->IoStatus
.Information
= 0;
111 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
113 FsRtlExitFileSystem();