]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
resize2fs: fix -M size calculations to avoid cutting off the inode table
authorTheodore Ts'o <tytso@mit.edu>
Tue, 1 Oct 2013 02:35:14 +0000 (22:35 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 1 Oct 2013 02:35:14 +0000 (22:35 -0400)
If the file system's inode table blocks in the last block group are
located in the middle or the end of the block group, it's possible for
resize2fs -M to use a size which will require relocating the inode
table blocks in the last block group.  This can lead to all sorts of
problems, so solve it by simply guaranteeing that we will never do
that.

Reported-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
resize/resize2fs.c

index 51b85b816c39c3766c6a5f7d267db8e3e0b1b158..1e4ac192029e6a80fbd6799fd9c8002fea7c8293 100644 (file)
@@ -2224,6 +2224,15 @@ blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags)
        blks_needed = (groups-1) * EXT2_BLOCKS_PER_GROUP(fs->super);
        blks_needed += overhead;
 
+       /*
+        * Make sure blks_needed covers the end of the inode table in
+        * the last block group.
+        */
+       overhead = ext2fs_inode_table_loc(fs, groups-1) +
+               fs->inode_blocks_per_group;
+       if (blks_needed < overhead)
+               blks_needed = overhead;
+
 #ifdef RESIZE2FS_DEBUG
        if (flags & RESIZE_DEBUG_MIN_CALC)
                printf("Estimated blocks needed: %llu\n", blks_needed);