| 22 | #endif |
| 23 | |
| 24 | NTSTATUS |
| 25 | Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext) |
| 26 | { |
| 27 | NTSTATUS Status; |
| 28 | |
| 29 | PIRP Irp; |
| 30 | |
| 31 | PEXT2_VCB Vcb; |
| 32 | PLIST_ENTRY ListEntry; |
| 33 | |
| 34 | BOOLEAN GlobalResourceAcquired = FALSE; |
| 35 | |
| 36 | __try { |
| 37 | |
| 38 | Status = STATUS_SUCCESS; |
| 39 | |
| 40 | ASSERT(IrpContext); |
| 41 | ASSERT((IrpContext->Identifier.Type == EXT2ICX) && |
| 42 | (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); |
| 43 | |
| 44 | Irp = IrpContext->Irp; |
| 45 | |
| 46 | if (!ExAcquireResourceExclusiveLite( |
| 47 | &Ext2Global->Resource, |
| 48 | IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT) )) { |
| 49 | Status = STATUS_PENDING; |
| 50 | __leave; |
| 51 | } |
| 52 | |
| 53 | GlobalResourceAcquired = TRUE; |
| 54 | |
| 55 | for (ListEntry = Ext2Global->VcbList.Flink; |
| 56 | ListEntry != &(Ext2Global->VcbList); |
| 57 | ListEntry = ListEntry->Flink ) { |
| 58 | |
| 59 | Vcb = CONTAINING_RECORD(ListEntry, EXT2_VCB, Next); |
| 60 | |
| 61 | if (ExAcquireResourceExclusiveLite( |
| 62 | &Vcb->MainResource, |
| 63 | TRUE )) { |
| 64 | |
| 65 | if (IsMounted(Vcb)) { |
| 66 | |
| 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; |
| 73 | } |
| 74 | Ext2SaveSuper(IrpContext, Vcb); |
| 75 | |
| 76 | /* flush dirty cache for all files */ |
| 77 | Status = Ext2FlushFiles(IrpContext, Vcb, TRUE); |
| 78 | if (!NT_SUCCESS(Status)) { |
| 79 | DbgBreak(); |
| 80 | } |
| 81 |
no test coverage detected