mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
ext4: correct offset of gdb backup in non meta_bg group to update_backups
commit31f13421c0
upstream. Commit0aeaa2559d
("ext4: fix corruption when online resizing a 1K bigalloc fs") found that primary superblock's offset in its group is not equal to offset of backup superblock in its group when block size is 1K and bigalloc is enabled. As group descriptor blocks are right after superblock, we can't pass block number of gdb to update_backups for the same reason. The root casue of the issue above is that leading 1K padding block is count as data block offset for primary block while backup block has no padding block offset in its group. Remove padding data block count to fix the issue for gdb backups. For meta_bg case, update_backups treat blk_off as block number, do no conversion in this case. Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Reviewed-by: Theodore Ts'o <tytso@mit.edu> Link: https://lore.kernel.org/r/20230826174712.4059355-2-shikemeng@huaweicloud.com Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8a3bb38bfd
commit
8798d3b272
1 changed files with 4 additions and 2 deletions
|
@ -1555,6 +1555,8 @@ static int ext4_flex_group_add(struct super_block *sb,
|
||||||
int gdb_num_end = ((group + flex_gd->count - 1) /
|
int gdb_num_end = ((group + flex_gd->count - 1) /
|
||||||
EXT4_DESC_PER_BLOCK(sb));
|
EXT4_DESC_PER_BLOCK(sb));
|
||||||
int meta_bg = ext4_has_feature_meta_bg(sb);
|
int meta_bg = ext4_has_feature_meta_bg(sb);
|
||||||
|
sector_t padding_blocks = meta_bg ? 0 : sbi->s_sbh->b_blocknr -
|
||||||
|
ext4_group_first_block_no(sb, 0);
|
||||||
sector_t old_gdb = 0;
|
sector_t old_gdb = 0;
|
||||||
|
|
||||||
update_backups(sb, ext4_group_first_block_no(sb, 0),
|
update_backups(sb, ext4_group_first_block_no(sb, 0),
|
||||||
|
@ -1566,8 +1568,8 @@ static int ext4_flex_group_add(struct super_block *sb,
|
||||||
gdb_num);
|
gdb_num);
|
||||||
if (old_gdb == gdb_bh->b_blocknr)
|
if (old_gdb == gdb_bh->b_blocknr)
|
||||||
continue;
|
continue;
|
||||||
update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data,
|
update_backups(sb, gdb_bh->b_blocknr - padding_blocks,
|
||||||
gdb_bh->b_size, meta_bg);
|
gdb_bh->b_data, gdb_bh->b_size, meta_bg);
|
||||||
old_gdb = gdb_bh->b_blocknr;
|
old_gdb = gdb_bh->b_blocknr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue