2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ***************************************************************/
16 extern PEXT2_GLOBAL Ext2Global
;
18 /* DEFINITIONS *************************************************************/
21 #pragma alloc_text(PAGE, Ext2ShutDown)
25 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
)
32 PLIST_ENTRY ListEntry
;
34 BOOLEAN GlobalResourceAcquired
= FALSE
;
38 Status
= STATUS_SUCCESS
;
41 ASSERT((IrpContext
->Identifier
.Type
== EXT2ICX
) &&
42 (IrpContext
->Identifier
.Size
== sizeof(EXT2_IRP_CONTEXT
)));
44 Irp
= IrpContext
->Irp
;
46 if (!ExAcquireResourceExclusiveLite(
47 &Ext2Global
->Resource
,
48 IsFlagOn(IrpContext
->Flags
, IRP_CONTEXT_FLAG_WAIT
) )) {
49 Status
= STATUS_PENDING
;
53 GlobalResourceAcquired
= TRUE
;
55 for (ListEntry
= Ext2Global
->VcbList
.Flink
;
56 ListEntry
!= &(Ext2Global
->VcbList
);
57 ListEntry
= ListEntry
->Flink
) {
59 Vcb
= CONTAINING_RECORD(ListEntry
, EXT2_VCB
, Next
);
61 if (ExAcquireResourceExclusiveLite(
67 /* update mount count */
68 Vcb
->SuperBlock
->s_mnt_count
++;
69 if (Vcb
->SuperBlock
->s_mnt_count
>
70 Vcb
->SuperBlock
->s_max_mnt_count
) {
71 Vcb
->SuperBlock
->s_mnt_count
=
72 Vcb
->SuperBlock
->s_max_mnt_count
;
74 Ext2SaveSuper(IrpContext
, Vcb
);
76 /* flush dirty cache for all files */
77 Status
= Ext2FlushFiles(IrpContext
, Vcb
, TRUE
);
78 if (!NT_SUCCESS(Status
)) {
82 /* flush volume stream's cache to disk */
83 Status
= Ext2FlushVolume(IrpContext
, Vcb
, TRUE
);
85 if (!NT_SUCCESS(Status
) && Status
!= STATUS_MEDIA_WRITE_PROTECTED
) {
89 /* send shutdown request to underlying disk */
90 Ext2DiskShutDown(Vcb
);
93 ExReleaseResourceLite(&Vcb
->MainResource
);
98 IoUnregisterFileSystem(Ext2Global->DiskdevObject);
99 IoUnregisterFileSystem(Ext2Global->CdromdevObject);
104 if (GlobalResourceAcquired
) {
105 ExReleaseResourceLite(&Ext2Global
->Resource
);
108 if (!IrpContext
->ExceptionInProgress
) {
109 if (Status
== STATUS_PENDING
) {
110 Ext2QueueRequest(IrpContext
);
112 Ext2CompleteIrpContext(IrpContext
, Status
);