2 * COPYRIGHT: GNU GENERAL PUBLIC LICENSE VERSION 2
3 * PROJECT: ReiserFs file system driver for Windows NT/2000/XP/Vista.
6 * PROGRAMMER: Mark Piper, Matt Wu, Bo Brantén.
11 /* INCLUDES *****************************************************************/
15 /* GLOBALS ***************************************************************/
17 extern PRFSD_GLOBAL RfsdGlobal
;
19 /* DEFINITIONS *************************************************************/
22 #pragma alloc_text(PAGE, RfsdShutDown)
25 __drv_mustHoldCriticalRegion
27 RfsdShutDown (IN PRFSD_IRP_CONTEXT IrpContext
)
32 PIO_STACK_LOCATION IrpSp
;
34 PLIST_ENTRY ListEntry
;
35 BOOLEAN GlobalResourceAcquired
= FALSE
;
43 ASSERT((IrpContext
->Identifier
.Type
== RFSDICX
) &&
44 (IrpContext
->Identifier
.Size
== sizeof(RFSD_IRP_CONTEXT
)));
46 Status
= STATUS_SUCCESS
;
48 Irp
= IrpContext
->Irp
;
50 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
53 #pragma prefast( suppress: 28137, "by design" )
55 if (!ExAcquireResourceExclusiveLite(
56 &RfsdGlobal
->Resource
,
57 IrpContext
->IsSynchronous
)) {
58 Status
= STATUS_PENDING
;
62 GlobalResourceAcquired
= TRUE
;
64 Event
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KEVENT
), RFSD_POOL_TAG
);
65 KeInitializeEvent(Event
, NotificationEvent
, FALSE
);
67 for (ListEntry
= RfsdGlobal
->VcbList
.Flink
;
68 ListEntry
!= &(RfsdGlobal
->VcbList
);
69 ListEntry
= ListEntry
->Flink
) {
71 Vcb
= CONTAINING_RECORD(ListEntry
, RFSD_VCB
, Next
);
73 if (ExAcquireResourceExclusiveLite(
77 Status
= RfsdFlushFiles(Vcb
, TRUE
);
78 if(!NT_SUCCESS(Status
)) {
82 Status
= RfsdFlushVolume(Vcb
, TRUE
);
84 if(!NT_SUCCESS(Status
)) {
88 RfsdDiskShutDown(Vcb
);
90 ExReleaseResourceForThreadLite(
92 ExGetCurrentResourceThread());
97 IoUnregisterFileSystem(RfsdGlobal->DeviceObject);
101 if (GlobalResourceAcquired
) {
102 ExReleaseResourceForThreadLite(
103 &RfsdGlobal
->Resource
,
104 ExGetCurrentResourceThread() );
107 if (!IrpContext
->ExceptionInProgress
) {
108 if (Status
== STATUS_PENDING
) {
109 RfsdQueueRequest(IrpContext
);
111 RfsdCompleteIrpContext(IrpContext
, Status
);