| 695 | } |
| 696 | |
| 697 | BOOLEAN |
| 698 | Ext2RemoveVcbExtent ( |
| 699 | IN PEXT2_VCB Vcb, |
| 700 | IN LONGLONG Vbn, |
| 701 | IN LONGLONG Length |
| 702 | ) |
| 703 | { |
| 704 | ULONG TriedTimes = 0; |
| 705 | LONGLONG Offset = 0; |
| 706 | BOOLEAN rc = TRUE; |
| 707 | |
| 708 | Offset = Vbn & (~(Vcb->IoUnitSize - 1)); |
| 709 | Length = (Length + Vbn - Offset + Vcb->IoUnitSize - 1) & (~(Vcb->IoUnitSize - 1)); |
| 710 | |
| 711 | ASSERT ((Offset & (Vcb->IoUnitSize - 1)) == 0); |
| 712 | ASSERT ((Length & (Vcb->IoUnitSize - 1)) == 0); |
| 713 | |
| 714 | Offset = (Offset >> Vcb->IoUnitBits) + 1; |
| 715 | Length = (Length >> Vcb->IoUnitBits); |
| 716 | |
| 717 | Again: |
| 718 | |
| 719 | __try { |
| 720 | FsRtlRemoveLargeMcbEntry( |
| 721 | &Vcb->Extents, |
| 722 | Offset, |
| 723 | Length |
| 724 | ); |
| 725 | } __except (EXCEPTION_EXECUTE_HANDLER) { |
| 726 | DbgBreak(); |
| 727 | rc = FALSE; |
| 728 | } |
| 729 | |
| 730 | if (!rc && ++TriedTimes < 10) { |
| 731 | Ext2Sleep(TriedTimes * 100); |
| 732 | goto Again; |
| 733 | } |
| 734 | |
| 735 | DEBUG(DL_EXT, ("Ext2RemoveVcbExtent: Vbn=%I64xh Length=%I64xh Runs=%u\n", |
| 736 | Offset, Length, FsRtlNumberOfRunsInLargeMcb(&Vcb->Extents))); |
| 737 | if (rc) { |
| 738 | Ext2CheckExtent(&Vcb->Extents, Offset, 0, Length, FALSE); |
| 739 | } |
| 740 | |
| 741 | return rc; |
| 742 | } |
| 743 | |
| 744 | BOOLEAN |
| 745 | Ext2LookupVcbExtent ( |
no test coverage detected