ext4_group_first_block_no should be used to computer block offset and first block no in group rather than group * block_per_group. Otherwise, if first_data_block != 0, the result is wrong. Signed-off-by: Yongqiang Yang <xiaoqiangnk@xxxxxxxxx> --- fs/ext4/resize.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 9a6fb74..58109fa 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c @@ -956,7 +956,6 @@ static void update_backups(struct super_block *sb, { struct ext4_sb_info *sbi = EXT4_SB(sb); const ext4_group_t last = sbi->s_groups_count; - const int bpg = EXT4_BLOCKS_PER_GROUP(sb); unsigned three = 1; unsigned five = 5; unsigned seven = 7; @@ -982,7 +981,8 @@ static void update_backups(struct super_block *sb, (err = ext4_journal_restart(handle, EXT4_MAX_TRANS_DATA))) break; - bh = sb_getblk(sb, group * bpg + blk_off); + bh = sb_getblk(sb, ext4_group_first_block_no(sb, group) + + blk_off); if (!bh) { err = -EIO; break; @@ -1291,15 +1291,17 @@ exit_journal: if (!err) { int i; - update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, - sizeof(struct ext4_super_block)); + ext4_fsblk_t first_block; + first_block = ext4_group_first_block_no(sb, 0); + update_backups(sb, sbi->s_sbh->b_blocknr - first_block, + (char *)es, sizeof(struct ext4_super_block)); for (i = 0; i < flex_gd->count; i++, group++) { struct buffer_head *gdb_bh; int gdb_num; gdb_num = group / EXT4_BLOCKS_PER_GROUP(sb); gdb_bh = sbi->s_group_desc[gdb_num]; - update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, - gdb_bh->b_size); + update_backups(sb, gdb_bh->b_blocknr - first_block, + gdb_bh->b_data, gdb_bh->b_size); } } exit: -- 1.7.5.1 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html