lloff_t Ext2Partition::extent_to_logical(EXT2_INODE *ino, lloff_t lbn) { lloff_t block; struct ext4_extent_header *header; header = get_ext4_header(ino); block = extent_binarysearch(header, lbn, false); return block; }
uint64_t Partition::ExtentToLogical(EXT2_INODE *ino, uint64_t lbn) { uint64_t block; struct ext4_extent_header *header; header = get_ext4_header(ino); block = ExtentBinarySearch(header, lbn, false); return block; }
NTSTATUS Ext2DoExtentExpand( IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN OUT PULONG Block, IN OUT PULONG Number ) { EXT4_EXTENT_HEADER *eh; struct buffer_head bh_got; int rc, flags; if (IsMcbDirectory(Mcb) || IrpContext->MajorFunction == IRP_MJ_WRITE) { flags = EXT4_GET_BLOCKS_IO_CONVERT_EXT; } else { flags = EXT4_GET_BLOCKS_IO_CREATE_EXT; } memset(&bh_got, 0, sizeof(struct buffer_head)); eh = get_ext4_header(&Mcb->Inode); if (eh->eh_magic != EXT4_EXT_MAGIC) { ext4_ext_tree_init(IrpContext, NULL, &Mcb->Inode); } if ((rc = ext4_ext_get_blocks( IrpContext, NULL, &Mcb->Inode, Index, *Number, &bh_got, 1, flags)) < 0) { DEBUG(DL_ERR, ("Expand Block insufficient resources, Number: %u," " err: %d\n", *Number, rc)); DbgBreak(); return Ext2WinntError(rc); } if (Number) *Number = rc ? rc : 1; if (Block) *Block = (ULONG)bh_got.b_blocknr; Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode); return STATUS_SUCCESS; }
NTSTATUS Ext2MapExtent( IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN BOOLEAN Alloc, OUT PULONG Block, OUT PULONG Number ) { EXT4_EXTENT_HEADER *eh; struct buffer_head bh_got; int flags, rc; ULONG max_blocks = 0; memset(&bh_got, 0, sizeof(struct buffer_head)); eh = get_ext4_header(&Mcb->Inode); if (eh->eh_magic != EXT4_EXT_MAGIC) { if (Alloc) { /* now initialize inode extent root node */ ext4_ext_tree_init(IrpContext, NULL, &Mcb->Inode); } else { /* return empty-mapping when inode extent isn't initialized */ if (Block) *Block = 0; if (Number) { LONGLONG _len = _len = Mcb->Inode.i_size; if (Mcb->Fcb) _len = Mcb->Fcb->Header.AllocationSize.QuadPart; *Number = (ULONG)((_len + BLOCK_SIZE - 1) >> BLOCK_BITS); } return STATUS_SUCCESS; } } /* IrpContext is NULL when called during journal initialization */ if (IsMcbDirectory(Mcb) || IrpContext == NULL || IrpContext->MajorFunction == IRP_MJ_WRITE || !Alloc){ flags = EXT4_GET_BLOCKS_IO_CONVERT_EXT; max_blocks = EXT_INIT_MAX_LEN; } else { flags = EXT4_GET_BLOCKS_IO_CREATE_EXT; max_blocks = EXT_UNWRITTEN_MAX_LEN; } if ((rc = ext4_ext_get_blocks( IrpContext, NULL, &Mcb->Inode, Index, max_blocks, &bh_got, Alloc, flags)) < 0) { DEBUG(DL_ERR, ("Block insufficient resources, err: %d\n", rc)); return Ext2WinntError(rc); } if (Alloc) Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode); if (Number) *Number = rc ? rc : 1; if (Block) *Block = (ULONG)bh_got.b_blocknr; return STATUS_SUCCESS; }