From: Theodore Ts'o Date: Tue, 1 Oct 2013 02:55:21 +0000 (-0400) Subject: resize2fs: relocate inode table blocks if necessary when shrinking X-Git-Tag: v1.42.9~142 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=e9736a3ba88b73e38fd56f5a7d1ee3b514cd713c;p=tools%2Fe2fsprogs.git resize2fs: relocate inode table blocks if necessary when shrinking If the file system is being shrunk, and a block group's inode table falls beyond the end of the inode table, we need to try to relocate the inode table blocks. Signed-off-by: "Theodore Ts'o" --- diff --git a/resize/resize2fs.c b/resize/resize2fs.c index 1e4ac19..ec1594e 100644 --- a/resize/resize2fs.c +++ b/resize/resize2fs.c @@ -884,24 +884,34 @@ static errcode_t blocks_to_move(ext2_resize_t rfs) fs = rfs->new_fs; /* - * If we're shrinking the filesystem, we need to move any group's - * bitmaps which are beyond the end of the new filesystem. + * If we're shrinking the filesystem, we need to move any + * group's metadata blocks (either allocation bitmaps or the + * inode table) which are beyond the end of the new + * filesystem. */ new_size = ext2fs_blocks_count(fs->super); if (new_size < ext2fs_blocks_count(old_fs->super)) { for (g = 0; g < fs->group_desc_count; g++) { + int realloc = 0; /* - * ext2fs_allocate_group_table re-allocates bitmaps - * which are set to block 0. + * ext2fs_allocate_group_table will re-allocate any + * metadata blocks whose location is set to zero. */ if (ext2fs_block_bitmap_loc(fs, g) >= new_size) { ext2fs_block_bitmap_loc_set(fs, g, 0); - retval = ext2fs_allocate_group_table(fs, g, 0); - if (retval) - return retval; + realloc = 1; } if (ext2fs_inode_bitmap_loc(fs, g) >= new_size) { ext2fs_inode_bitmap_loc_set(fs, g, 0); + realloc = 1; + } + if ((ext2fs_inode_table_loc(fs, g) + + fs->inode_blocks_per_group) > new_size) { + ext2fs_inode_table_loc_set(fs, g, 0); + realloc = 1; + } + + if (realloc) { retval = ext2fs_allocate_group_table(fs, g, 0); if (retval) return retval;