| 2703 | } |
| 2704 | |
| 2705 | NTSTATUS |
| 2706 | Ext2PurgeVolume (IN PEXT2_VCB Vcb, |
| 2707 | IN BOOLEAN FlushBeforePurge ) |
| 2708 | { |
| 2709 | PEXT2_FCB Fcb; |
| 2710 | LIST_ENTRY List, *Next; |
| 2711 | |
| 2712 | BOOLEAN VcbResourceAcquired = FALSE; |
| 2713 | BOOLEAN FcbResourceAcquired = FALSE; |
| 2714 | BOOLEAN gdResourceAcquired = FALSE; |
| 2715 | |
| 2716 | __try { |
| 2717 | |
| 2718 | ASSERT(Vcb != NULL); |
| 2719 | ASSERT((Vcb->Identifier.Type == EXT2VCB) && |
| 2720 | (Vcb->Identifier.Size == sizeof(EXT2_VCB))); |
| 2721 | |
| 2722 | ExAcquireResourceExclusiveLite(&Vcb->MainResource, TRUE); |
| 2723 | VcbResourceAcquired = TRUE; |
| 2724 | |
| 2725 | if (IsVcbReadOnly(Vcb)) { |
| 2726 | FlushBeforePurge = FALSE; |
| 2727 | } |
| 2728 | |
| 2729 | InitializeListHead(&List); |
| 2730 | |
| 2731 | ExAcquireResourceExclusiveLite(&Vcb->FcbLock, TRUE); |
| 2732 | FcbResourceAcquired = TRUE; |
| 2733 | |
| 2734 | while (!IsListEmpty(&Vcb->FcbList)) { |
| 2735 | |
| 2736 | Next = RemoveHeadList(&Vcb->FcbList); |
| 2737 | Fcb = CONTAINING_RECORD(Next, EXT2_FCB, Next); |
| 2738 | |
| 2739 | DEBUG(DL_INF, ( "Ext2PurgeVolume: %wZ refercount=%xh\n", |
| 2740 | &Fcb->Mcb->FullName, Fcb->ReferenceCount)); |
| 2741 | InsertTailList(&List, &Fcb->Next); |
| 2742 | } |
| 2743 | |
| 2744 | while (!IsListEmpty(&List)) { |
| 2745 | |
| 2746 | Next = RemoveHeadList(&List); |
| 2747 | Fcb = CONTAINING_RECORD(Next, EXT2_FCB, Next); |
| 2748 | |
| 2749 | if (ExAcquireResourceExclusiveLite( |
| 2750 | &Fcb->MainResource, |
| 2751 | TRUE )) { |
| 2752 | |
| 2753 | Ext2PurgeFile(Fcb, FlushBeforePurge); |
| 2754 | |
| 2755 | if (Fcb->ReferenceCount <= 1) { |
| 2756 | Fcb->TsDrop.QuadPart = 0; |
| 2757 | InsertHeadList(&Vcb->FcbList, &Fcb->Next); |
| 2758 | } else { |
| 2759 | InsertTailList(&Vcb->FcbList, &Fcb->Next); |
| 2760 | } |
| 2761 | ExReleaseResourceLite(&Fcb->MainResource); |
| 2762 | } |
no test coverage detected