ext4: add correct group descriptors and reserved GDT blocks to system zone
commit 68228da51c9a436872a4ef4b5a7692e29f7e5bc7 upstream. When setup_system_zone, flex_bg is not initialized so it is always 1. Use a new helper function, ext4_num_base_meta_blocks() which does not depend on sbi->s_log_groups_per_flex being initialized. [ Squashed two patches in the Link URL's below together into a single commit, which is simpler to review/understand. Also fix checkpatch warnings. --TYT ] Cc: stable@kernel.org Signed-off-by: Wang Jianjian <wangjianjian0@foxmail.com> Link: https://lore.kernel.org/r/tencent_21AF0D446A9916ED5C51492CC6C9A0A77B05@qq.com Link: https://lore.kernel.org/r/tencent_D744D1450CC169AEA77FCF0A64719909ED05@qq.com Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
6612d5b535
commit
b1d63e2bbd
@@ -903,11 +903,11 @@ unsigned long ext4_bg_num_gdb(struct super_block *sb, ext4_group_t group)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function returns the number of file system metadata clusters at
|
* This function returns the number of file system metadata blocks at
|
||||||
* the beginning of a block group, including the reserved gdt blocks.
|
* the beginning of a block group, including the reserved gdt blocks.
|
||||||
*/
|
*/
|
||||||
static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
|
unsigned int ext4_num_base_meta_blocks(struct super_block *sb,
|
||||||
ext4_group_t block_group)
|
ext4_group_t block_group)
|
||||||
{
|
{
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||||
unsigned num;
|
unsigned num;
|
||||||
@@ -925,8 +925,15 @@ static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
|
|||||||
} else { /* For META_BG_BLOCK_GROUPS */
|
} else { /* For META_BG_BLOCK_GROUPS */
|
||||||
num += ext4_bg_num_gdb(sb, block_group);
|
num += ext4_bg_num_gdb(sb, block_group);
|
||||||
}
|
}
|
||||||
return EXT4_NUM_B2C(sbi, num);
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int ext4_num_base_meta_clusters(struct super_block *sb,
|
||||||
|
ext4_group_t block_group)
|
||||||
|
{
|
||||||
|
return EXT4_NUM_B2C(EXT4_SB(sb), ext4_num_base_meta_blocks(sb, block_group));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ext4_inode_to_goal_block - return a hint for block allocation
|
* ext4_inode_to_goal_block - return a hint for block allocation
|
||||||
* @inode: inode for block allocation
|
* @inode: inode for block allocation
|
||||||
|
@@ -217,7 +217,6 @@ int ext4_setup_system_zone(struct super_block *sb)
|
|||||||
struct ext4_system_blocks *system_blks;
|
struct ext4_system_blocks *system_blks;
|
||||||
struct ext4_group_desc *gdp;
|
struct ext4_group_desc *gdp;
|
||||||
ext4_group_t i;
|
ext4_group_t i;
|
||||||
int flex_size = ext4_flex_bg_size(sbi);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
system_blks = kzalloc(sizeof(*system_blks), GFP_KERNEL);
|
system_blks = kzalloc(sizeof(*system_blks), GFP_KERNEL);
|
||||||
@@ -225,12 +224,13 @@ int ext4_setup_system_zone(struct super_block *sb)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i=0; i < ngroups; i++) {
|
for (i=0; i < ngroups; i++) {
|
||||||
|
unsigned int meta_blks = ext4_num_base_meta_blocks(sb, i);
|
||||||
|
|
||||||
cond_resched();
|
cond_resched();
|
||||||
if (ext4_bg_has_super(sb, i) &&
|
if (meta_blks != 0) {
|
||||||
((i < 5) || ((i % flex_size) == 0))) {
|
|
||||||
ret = add_system_zone(system_blks,
|
ret = add_system_zone(system_blks,
|
||||||
ext4_group_first_block_no(sb, i),
|
ext4_group_first_block_no(sb, i),
|
||||||
ext4_bg_num_gdb(sb, i) + 1, 0);
|
meta_blks, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@@ -2967,6 +2967,8 @@ extern const char *ext4_decode_error(struct super_block *sb, int errno,
|
|||||||
extern void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
|
extern void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
|
||||||
ext4_group_t block_group,
|
ext4_group_t block_group,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
extern unsigned int ext4_num_base_meta_blocks(struct super_block *sb,
|
||||||
|
ext4_group_t block_group);
|
||||||
|
|
||||||
extern __printf(6, 7)
|
extern __printf(6, 7)
|
||||||
void __ext4_error(struct super_block *, const char *, unsigned int, int, __u64,
|
void __ext4_error(struct super_block *, const char *, unsigned int, int, __u64,
|
||||||
|
Reference in New Issue
Block a user