Messages in this thread Patch in this message | | | Subject | [RFC][18/21]ext2resize fix how to calculate an offset | From | sho@tnes ... | Date | Thu, 13 Apr 2006 16:13:44 +0900 |
| |
Summary of this patch: [18/21] fix the bug that an offset of an inode table is erroneously calculated - Running ext2resize results in failure due to an erroneous offset of an inode table, then I fix how to calculate it.
Signed-off-by: Takashi Sato sho@tnes.nec.co.jp --- diff -Nurp ext2resize-1.1.19/src/ext2_block_relocator.c ../a/ext2resize-1.1.19/src/ext2_block_relocator.c --- ext2resize-1.1.19/src/ext2_block_relocator.c 2004-09-30 22:05:55.000000000 +0800 +++ ../a/ext2resize-1.1.19/src/ext2_block_relocator.c 2006-03-24 12:07:41.000000000 +0800 @@ -496,6 +496,10 @@ static int ext2_block_relocator_grab_blo int raid_bb, raid_ib; int itend = state->newallocoffset; + if (!ext2_bg_has_super(fs, group)) + itend = fs->gd[group].bg_inode_table + +fs->inodeblocks - start; + bpg = fs->sb.s_blocks_per_group; if (start + bpg > fs->newblocks) bpg = fs->newblocks - start; diff -Nurp ext2resize-1.1.19/src/ext2.h ../a/ext2resize-1.1.19/src/ext2.h --- ext2resize-1.1.19/src/ext2.h 2006-03-24 12:09:37.000000000 +0800 +++ ../a/ext2resize-1.1.19/src/ext2.h 2006-03-24 12:05:00.000000000 +0800 @@ -262,7 +262,7 @@ static int __inline__ ext2_is_data_block group = blk / fs->sb.s_blocks_per_group; blk %= fs->sb.s_blocks_per_group; - if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks) + if (ext2_bg_has_super(fs, group) && blk <= fs->gdblocks + fs->resgdblocks) return 0; if (block == fs->gd[group].bg_block_bitmap || diff -Nurp ext2resize-1.1.19/src/ext2_meta.c ../a/ext2resize-1.1.19/src/ext2_meta.c --- ext2resize-1.1.19/src/ext2_meta.c 2004-09-30 22:01:41.000000000 +0800 +++ ../a/ext2resize-1.1.19/src/ext2_meta.c 2006-03-24 12:05:00.000000000 +0800 @@ -109,6 +109,12 @@ int ext2_metadata_push(struct ext2_fs *f int has_sb; int diff; + has_sb = ext2_bg_has_super(fs, group); + if(!has_sb) + new_itoffset = 2; + else + new_itoffset = fs->newgdblocks +3; + diff = start + new_itoffset - fs->gd[group].bg_inode_table; old_itend =fs->gd[group].bg_inode_table +fs->inodeblocks -start; new_itend = new_itoffset + fs->inodeblocks; @@ -116,8 +122,6 @@ int ext2_metadata_push(struct ext2_fs *f if (start + bpg > fs->sb.s_blocks_count) bpg = fs->sb.s_blocks_count - start; - has_sb = ext2_bg_has_super(fs, group); - bb = fs->gd[group].bg_block_bitmap - start; ib = fs->gd[group].bg_inode_bitmap - start; if (fs->stride) { @@ -187,7 +191,7 @@ int ext2_metadata_push(struct ext2_fs *f group + 1, fs->numgroups); } - fs->itoffset = new_itoffset; + fs->itoffset = fs->newgdblocks + 3; if (fs->flags & FL_VERBOSE) printf("\n"); diff -Nurp ext2resize-1.1.19/src/ext2_resize.c ../a/ext2resize-1.1.19/src/ext2_resize.c --- ext2resize-1.1.19/src/ext2_resize.c 2006-03-24 12:09:37.000000000 +0800 +++ ../a/ext2resize-1.1.19/src/ext2_resize.c 2006-03-24 12:05:00.000000000 +0800 @@ -157,7 +157,7 @@ static int ext2_add_group(struct ext2_fs return 1; } -static int ext2_del_group(struct ext2_fs *fs) +static int ext2_del_group(struct ext2_fs *fs, int old_gdblocks) { blk_t admin; int group = fs->numgroups - 1; @@ -170,7 +170,7 @@ static int ext2_del_group(struct ext2_fs has_sb = ext2_bg_has_super(fs, group); - admin = fs->inodeblocks + (has_sb ? fs->gdblocks + 3 : 2); + admin = fs->inodeblocks + (has_sb ? old_gdblocks + 3 : 2); bpg = fs->sb.s_blocks_count - fs->sb.s_first_data_block - group * fs->sb.s_blocks_per_group; @@ -407,6 +407,8 @@ static int ext2_grow_fs(struct ext2_fs * static int ext2_shrink_fs(struct ext2_fs *fs) { + int old_gdblocks; + if (fs->flags & FL_DEBUG) printf("%s\n", __FUNCTION__); @@ -435,6 +437,8 @@ static int ext2_shrink_fs(struct ext2_fs if (!ext2_block_relocate(fs)) return 0; + old_gdblocks = fs->gdblocks; + while (fs->sb.s_blocks_count > fs->newblocks) { blk_t sizelast = (fs->sb.s_blocks_count - fs->sb.s_first_data_block) - @@ -445,7 +449,7 @@ static int ext2_shrink_fs(struct ext2_fs fs->sb.s_blocks_count)) return 0; } else { - if (!ext2_del_group(fs)) + if (!ext2_del_group(fs, old_gdblocks)) return 0; } } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |