From: Theodore Ts'o Date: Wed, 21 Jul 2010 20:10:10 +0000 (-0400) Subject: libext2fs: Fix ext2fs_iblk_{add,sub}_blocks() when the i_blocks_hi is non-zero X-Git-Tag: v1.41.90.wc1~46 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=47e155df575be3664493903507ac40d56c9b4e7d;p=tools%2Fe2fsprogs.git libext2fs: Fix ext2fs_iblk_{add,sub}_blocks() when the i_blocks_hi is non-zero Signed-off-by: "Theodore Ts'o" --- diff --git a/lib/ext2fs/i_block.c b/lib/ext2fs/i_block.c index 822776d..39d93ee 100644 --- a/lib/ext2fs/i_block.c +++ b/lib/ext2fs/i_block.c @@ -31,6 +31,9 @@ errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode, { unsigned long long b = inode->i_blocks; + if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) + b += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; + if (!(fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) @@ -38,11 +41,9 @@ errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode, b += num_blocks; - if (fs->super->s_feature_ro_compat & - EXT4_FEATURE_RO_COMPAT_HUGE_FILE) { - b += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; + if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) inode->osd2.linux2.l_i_blocks_hi = b >> 32; - } else if (b > 0xFFFFFFFF) + else if (b > 0xFFFFFFFF) return EOVERFLOW; inode->i_blocks = b & 0xFFFFFFFF; return 0; @@ -53,6 +54,9 @@ errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode, { unsigned long long b = inode->i_blocks; + if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) + b += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; + if (!(fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) @@ -63,11 +67,8 @@ errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode, b -= num_blocks; - if (fs->super->s_feature_ro_compat & - EXT4_FEATURE_RO_COMPAT_HUGE_FILE) { - b += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; + if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) inode->osd2.linux2.l_i_blocks_hi = b >> 32; - } inode->i_blocks = b & 0xFFFFFFFF; return 0; }