From b2e6c86d61fccc39956c0cb8a8333f42d1569e8d Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Thu, 16 Jun 2011 10:12:43 -0400 Subject: [PATCH] mke2fs, e2fsck: fix i_blocks handling for bigalloc file systems Signed-off-by: "Theodore Ts'o" --- e2fsck/pass1.c | 8 +++++--- lib/ext2fs/expanddir.c | 2 +- lib/ext2fs/i_block.c | 3 +++ lib/ext2fs/mkjournal.c | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index cf184c5..dbf3c94 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -1804,8 +1804,10 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx, (EXT2FS_B2C(ctx->fs, blk) == EXT2FS_B2C(ctx->fs, pb->previous_block)) && (blk & EXT2FS_CLUSTER_MASK(ctx->fs)) == - (blockcnt & EXT2FS_CLUSTER_MASK(ctx->fs)))) + (blockcnt & EXT2FS_CLUSTER_MASK(ctx->fs)))) { mark_block_used(ctx, blk); + pb->num_blocks++; + } pb->previous_block = blk; @@ -1824,7 +1826,6 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx, } if (is_dir && extent.e_len > 0) pb->last_db_block = blockcnt - 1; - pb->num_blocks += extent.e_len; pb->previous_block = extent.e_pblk + extent.e_len - 1; start_block = pb->last_block = extent.e_lblk + extent.e_len - 1; next: @@ -1981,8 +1982,9 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) pb.num_blocks *= (fs->blocksize / 512); + pb.num_blocks *= EXT2FS_CLUSTER_RATIO(fs); #if 0 - printf("inode %u, i_size = %lu, last_block = %lld, i_blocks=%lu, num_blocks = %lu\n", + printf("inode %u, i_size = %u, last_block = %lld, i_blocks=%llu, num_blocks = %llu\n", ino, inode->i_size, pb.last_block, ext2fs_inode_i_blocks(fs, inode), pb.num_blocks); #endif diff --git a/lib/ext2fs/expanddir.c b/lib/ext2fs/expanddir.c index 47af3a5..8f738c8 100644 --- a/lib/ext2fs/expanddir.c +++ b/lib/ext2fs/expanddir.c @@ -52,6 +52,7 @@ static int expand_dir_proc(ext2_filsys fs, es->err = retval; return BLOCK_ABORT; } + es->newblocks++; } if (blockcnt > 0) { retval = ext2fs_new_dir_block(fs, 0, 0, &block); @@ -79,7 +80,6 @@ static int expand_dir_proc(ext2_filsys fs, ext2fs_free_mem(&block); *blocknr = new_blk; ext2fs_block_alloc_stats2(fs, new_blk, +1); - es->newblocks++; if (es->done) return (BLOCK_CHANGED | BLOCK_ABORT); diff --git a/lib/ext2fs/i_block.c b/lib/ext2fs/i_block.c index 39d93ee..f36c3c4 100644 --- a/lib/ext2fs/i_block.c +++ b/lib/ext2fs/i_block.c @@ -38,6 +38,7 @@ errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode, EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) num_blocks *= fs->blocksize / 512; + num_blocks *= EXT2FS_CLUSTER_RATIO(fs); b += num_blocks; @@ -61,6 +62,7 @@ errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode, EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) num_blocks *= fs->blocksize / 512; + num_blocks *= EXT2FS_CLUSTER_RATIO(fs); if (num_blocks > b) return EOVERFLOW; @@ -79,6 +81,7 @@ errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b) EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || !(inode->i_flags & EXT4_HUGE_FILE_FL)) b *= fs->blocksize / 512; + b *= EXT2FS_CLUSTER_RATIO(fs); inode->i_blocks = b & 0xFFFFFFFF; if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c index 5113ced..aaad2f6 100644 --- a/lib/ext2fs/mkjournal.c +++ b/lib/ext2fs/mkjournal.c @@ -249,11 +249,11 @@ static int mkjournal_proc(ext2_filsys fs, es->err = retval; return BLOCK_ABORT; } + es->newblocks++; } if (blockcnt >= 0) es->num_blocks--; - es->newblocks++; retval = 0; if (blockcnt <= 0) retval = io_channel_write_blk64(fs->io, new_blk, 1, es->buf); -- 1.8.3.1