From 2215293c7e85c88d2fbc06f9e9438fca9a25213c Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Mon, 30 Sep 2013 22:35:14 -0400 Subject: [PATCH] resize2fs: fix -M size calculations to avoid cutting off the inode table 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 Signed-off-by: "Theodore Ts'o" --- resize/resize2fs.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resize/resize2fs.c b/resize/resize2fs.c index 51b85b8..1e4ac19 100644 --- a/resize/resize2fs.c +++ b/resize/resize2fs.c @@ -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); -- 1.8.3.1