diff options
author | Theodore Ts'o <tytso@mit.edu> | 2013-09-30 22:55:21 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-09-30 22:55:21 -0400 |
commit | e9736a3ba88b73e38fd56f5a7d1ee3b514cd713c (patch) | |
tree | 363a1fd18c9ddb032e11181dcc37738b588a2e30 /resize | |
parent | 2215293c7e85c88d2fbc06f9e9438fca9a25213c (diff) | |
download | e2fsprogs-e9736a3ba88b73e38fd56f5a7d1ee3b514cd713c.tar.gz |
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" <tytso@mit.edu>
Diffstat (limited to 'resize')
-rw-r--r-- | resize/resize2fs.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/resize/resize2fs.c b/resize/resize2fs.c index 1e4ac192..ec1594ef 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; |