Skip to content

Commit 0aeaa25

Browse files
LiBaokun96tytso
authored andcommitted
ext4: fix corruption when online resizing a 1K bigalloc fs
When a backup superblock is updated in update_backups(), the primary superblock's offset in the group (that is, sbi->s_sbh->b_blocknr) is used as the backup superblock's offset in its group. However, when the block size is 1K and bigalloc is enabled, the two offsets are not equal. This causes the backup group descriptors to be overwritten by the superblock in update_backups(). Moreover, if meta_bg is enabled, the file system will be corrupted because this feature uses backup group descriptors. To solve this issue, we use a more accurate ext4_group_first_block_no() as the offset of the backup superblock in its group. Fixes: d77147f ("ext4: add support for online resizing with bigalloc") Signed-off-by: Baokun Li <[email protected]> Reviewed-by: Jan Kara <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 8f49ec6 commit 0aeaa25

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

fs/ext4/resize.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1604,8 +1604,8 @@ static int ext4_flex_group_add(struct super_block *sb,
16041604
int meta_bg = ext4_has_feature_meta_bg(sb);
16051605
sector_t old_gdb = 0;
16061606

1607-
update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es,
1608-
sizeof(struct ext4_super_block), 0);
1607+
update_backups(sb, ext4_group_first_block_no(sb, 0),
1608+
(char *)es, sizeof(struct ext4_super_block), 0);
16091609
for (; gdb_num <= gdb_num_end; gdb_num++) {
16101610
struct buffer_head *gdb_bh;
16111611

@@ -1816,7 +1816,7 @@ static int ext4_group_extend_no_check(struct super_block *sb,
18161816
if (test_opt(sb, DEBUG))
18171817
printk(KERN_DEBUG "EXT4-fs: extended group to %llu "
18181818
"blocks\n", ext4_blocks_count(es));
1819-
update_backups(sb, EXT4_SB(sb)->s_sbh->b_blocknr,
1819+
update_backups(sb, ext4_group_first_block_no(sb, 0),
18201820
(char *)es, sizeof(struct ext4_super_block), 0);
18211821
}
18221822
return err;

0 commit comments

Comments
 (0)