MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2TruncateBlock

Function Ext2TruncateBlock

Ext4Fsd/ext3/indirect.c:623–820  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

621
622
623NTSTATUS
624Ext2TruncateBlock(
625 IN PEXT2_IRP_CONTEXT IrpContext,
626 IN PEXT2_VCB Vcb,
627 IN PEXT2_MCB Mcb,
628 IN ULONG Base,
629 IN ULONG Start,
630 IN ULONG Layer,
631 IN ULONG SizeArray,
632 IN PULONG BlockArray,
633 IN PULONG Extra
634)
635{
636 NTSTATUS Status = STATUS_SUCCESS;
637 ULONG i = 0;
638 ULONG Slot = 0;
639 ULONG Skip = 0;
640
641 LONGLONG Offset;
642 PBCB Bcb = NULL;
643 PULONG pData = NULL;
644
645 ASSERT(Mcb != NULL);
646
647 for (i = 0; i < SizeArray; i++) {
648
649 if (Layer == 0) {
650
651 ULONG Number = 1;
652
653 while (Extra && SizeArray > i + 1 && Number < *Extra) {
654
655 if (BlockArray[SizeArray - i - 1] ==
656 BlockArray[SizeArray - i - 2] + 1) {
657
658 BlockArray[SizeArray - i - 1] = 0;
659 Number++;
660 SizeArray--;
661
662 } else {
663 break;
664 }
665 }
666
667 if (BlockArray[SizeArray - i - 1]) {
668
669 Status = Ext2FreeBlock(IrpContext, Vcb, BlockArray[SizeArray - i - 1], Number);
670 if (NT_SUCCESS(Status)) {
671 ASSERT(Mcb->Inode.i_blocks >= (Number << (BLOCK_BITS - 9)));
672 if (Mcb->Inode.i_blocks < (Number << (BLOCK_BITS - 9))) {
673 Mcb->Inode.i_blocks = 0;
674 DbgBreak();
675 } else {
676 Mcb->Inode.i_blocks -= (Number << (BLOCK_BITS - 9));
677 }
678 BlockArray[SizeArray - i - 1] = 0;
679 }
680 }

Callers 1

Ext2TruncateIndirectFunction · 0.85

Calls 7

Ext2FreeBlockFunction · 0.85
Ext2RemoveBlockExtentFunction · 0.85
Ext2ClearAllExtentsFunction · 0.85
Ext2AddVcbExtentFunction · 0.85
Ext2IsBlockEmptyFunction · 0.85
Ext2RemoveMcbMetaExtsFunction · 0.85
Ext2SleepFunction · 0.85

Tested by

no test coverage detected