ext4: add correct group descriptors and reserved GDT blocks to system zone
authorWang Jianjian <wangjianjian0@foxmail.com>
Wed, 2 Aug 2023 16:28:39 +0000 (00:28 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 27 Aug 2023 15:27:12 +0000 (11:27 -0400)
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>
fs/ext4/balloc.c
fs/ext4/block_validity.c
fs/ext4/ext4.h

index 1f72f97..79b20d6 100644 (file)
@@ -913,11 +913,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.
  */
-static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
-                                    ext4_group_t block_group)
+unsigned int ext4_num_base_meta_blocks(struct super_block *sb,
+                                      ext4_group_t block_group)
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        unsigned num;
@@ -935,8 +935,15 @@ static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
        } else { /* For META_BG_BLOCK_GROUPS */
                num += ext4_bg_num_gdb_meta(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
  *     @inode: inode for block allocation
index 5504f72..6fe3c94 100644 (file)
@@ -215,7 +215,6 @@ int ext4_setup_system_zone(struct super_block *sb)
        struct ext4_system_blocks *system_blks;
        struct ext4_group_desc *gdp;
        ext4_group_t i;
-       int flex_size = ext4_flex_bg_size(sbi);
        int ret;
 
        system_blks = kzalloc(sizeof(*system_blks), GFP_KERNEL);
@@ -223,12 +222,13 @@ int ext4_setup_system_zone(struct super_block *sb)
                return -ENOMEM;
 
        for (i=0; i < ngroups; i++) {
+               unsigned int meta_blks = ext4_num_base_meta_blocks(sb, i);
+
                cond_resched();
-               if (ext4_bg_has_super(sb, i) &&
-                   ((i < 5) || ((i % flex_size) == 0))) {
+               if (meta_blks != 0) {
                        ret = add_system_zone(system_blks,
                                        ext4_group_first_block_no(sb, i),
-                                       ext4_bg_num_gdb(sb, i) + 1, 0);
+                                       meta_blks, 0);
                        if (ret)
                                goto err;
                }
index ae458cd..2c2c319 100644 (file)
@@ -3079,6 +3079,8 @@ extern const char *ext4_decode_error(struct super_block *sb, int errno,
 extern void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
                                             ext4_group_t block_group,
                                             unsigned int flags);
+extern unsigned int ext4_num_base_meta_blocks(struct super_block *sb,
+                                             ext4_group_t block_group);
 
 extern __printf(7, 8)
 void __ext4_error(struct super_block *, const char *, unsigned int, bool,