Whamcloud - gitweb
mke2fs, e2fsck: fix i_blocks handling for bigalloc file systems
authorTheodore Ts'o <tytso@mit.edu>
Thu, 16 Jun 2011 14:12:43 +0000 (10:12 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 16 Jun 2011 14:12:43 +0000 (10:12 -0400)
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass1.c
lib/ext2fs/expanddir.c
lib/ext2fs/i_block.c
lib/ext2fs/mkjournal.c

index cf184c5..dbf3c94 100644 (file)
@@ -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
index 47af3a5..8f738c8 100644 (file)
@@ -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);
index 39d93ee..f36c3c4 100644 (file)
@@ -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)
index 5113ced..aaad2f6 100644 (file)
@@ -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);