Whamcloud - gitweb
LU-15002 mke2fs: set free blocks accurately for groups has GDT 73/52273/3
authorLi Dongyang <dongyangli@ddn.com>
Tue, 5 Sep 2023 13:12:35 +0000 (23:12 +1000)
committerAndreas Dilger <adilger@whamcloud.com>
Mon, 25 Sep 2023 05:58:00 +0000 (05:58 +0000)
This patch is part of the preparation required to allow
GDT blocks expand beyond a single group,
it introduces 2 new interfaces:
- ext2fs_count_used_blocks(), to return the blocks used
in the bitmap range.
- ext2fs_reserve_super_and_bgd2() to return blocks used by
superblock/GDT blocks for every group, by looking up blocks used.

Change-Id: Ic26de963ed234af1099d00be6f7b6d0edc057c97
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/tools/e2fsprogs/+/52273
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lib/ext2fs/alloc_sb.c
lib/ext2fs/ext2fs.h
lib/ext2fs/gen_bitmap64.c
lib/ext2fs/initialize.c
misc/mke2fs.c

index 8530b40..e92739e 100644 (file)
@@ -46,8 +46,7 @@ int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
                                 ext2fs_block_bitmap bmap)
 {
        blk64_t super_blk, old_desc_blk, new_desc_blk;
-       blk_t   used_blks;
-       int     old_desc_blocks, num_blocks;
+       blk_t   used_blks, old_desc_blocks, num_blocks;
 
        ext2fs_super_and_bgd_loc2(fs, group, &super_blk,
                                  &old_desc_blk, &new_desc_blk, &used_blks);
@@ -79,3 +78,28 @@ int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
 
        return num_blocks  ;
 }
+
+/*
+ * This function reserves the superblock and block group descriptors
+ * for a given block group and returns the number of blocks used by the
+ * super block and group descriptors by looking up the block bitmap.
+ */
+errcode_t ext2fs_reserve_super_and_bgd2(ext2_filsys fs,
+                                       dgrp_t group,
+                                       ext2fs_block_bitmap bmap,
+                                       blk_t *desc_blocks)
+{
+       blk64_t num_blocks;
+       errcode_t retval = 0;
+
+       ext2fs_reserve_super_and_bgd(fs, group, bmap);
+
+       retval = ext2fs_count_used_blocks(fs,
+                                       ext2fs_group_first_block2(fs, group),
+                                       ext2fs_group_last_block2(fs, group),
+                                       &num_blocks);
+       if (!retval)
+               *desc_blocks = num_blocks;
+
+       return retval;
+}
index 19f36f4..877130e 100644 (file)
@@ -803,6 +803,10 @@ errcode_t ext2fs_alloc_range(ext2_filsys fs, int flags, blk64_t goal,
 extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
                                        dgrp_t group,
                                        ext2fs_block_bitmap bmap);
+extern errcode_t ext2fs_reserve_super_and_bgd2(ext2_filsys fs,
+                                              dgrp_t group,
+                                              ext2fs_block_bitmap bmap,
+                                              blk_t *desc_blocks);
 extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
                                                  void (*func)(ext2_filsys fs,
                                                               blk64_t blk,
@@ -1517,6 +1521,8 @@ errcode_t ext2fs_convert_subcluster_bitmap(ext2_filsys fs,
                                           ext2fs_block_bitmap *bitmap);
 errcode_t ext2fs_count_used_clusters(ext2_filsys fs, blk64_t start,
                                     blk64_t end, blk64_t *out);
+errcode_t ext2fs_count_used_blocks(ext2_filsys fs, blk64_t start,
+                                  blk64_t end, blk64_t *out);
 extern unsigned int ext2fs_list_backups(ext2_filsys fs, unsigned int *three,
                                unsigned int *five, unsigned int *seven);
 
index e5208c3..f84b59a 100644 (file)
@@ -1007,8 +1007,8 @@ errcode_t ext2fs_find_first_set_generic_bmap(ext2fs_generic_bitmap bitmap,
        return ENOENT;
 }
 
-errcode_t ext2fs_count_used_clusters(ext2_filsys fs, blk64_t start,
-                                    blk64_t end, blk64_t *out)
+errcode_t ext2fs_count_used_blocks(ext2_filsys fs, blk64_t start,
+                                  blk64_t end, blk64_t *out)
 {
        blk64_t         next;
        blk64_t         tot_set = 0;
@@ -1038,6 +1038,19 @@ errcode_t ext2fs_count_used_clusters(ext2_filsys fs, blk64_t start,
        }
 
        if (!retval)
+               *out = tot_set;
+       return retval;
+}
+
+errcode_t ext2fs_count_used_clusters(ext2_filsys fs, blk64_t start,
+                                    blk64_t end, blk64_t *out)
+{
+       blk64_t         tot_set = 0;
+       errcode_t       retval = 0;
+
+       retval = ext2fs_count_used_blocks(fs, start, end, &tot_set);
+
+       if (!retval)
                *out = EXT2FS_NUM_B2C(fs, tot_set);
        return retval;
 }
index b62c6bb..6fb49be 100644 (file)
@@ -523,6 +523,15 @@ ipg_retry:
        csum_flag = ext2fs_has_group_desc_csum(fs);
        reserved_inos = super->s_first_ino;
        for (i = 0; i < fs->group_desc_count; i++) {
+               blk_t grp_free_blocks;
+               ext2_ino_t inodes;
+
+               retval = ext2fs_reserve_super_and_bgd2(fs, i,
+                                                      fs->block_map,
+                                                      &numblocks);
+               if (retval)
+                       goto cleanup;
+
                /*
                 * Don't set the BLOCK_UNINIT group for the last group
                 * because the block bitmap needs to be padded.
@@ -532,24 +541,25 @@ ipg_retry:
                                ext2fs_bg_flags_set(fs, i,
                                                    EXT2_BG_BLOCK_UNINIT);
                        ext2fs_bg_flags_set(fs, i, EXT2_BG_INODE_UNINIT);
-                       numblocks = super->s_inodes_per_group;
+                       inodes = super->s_inodes_per_group;
                        if (reserved_inos) {
-                               if (numblocks > reserved_inos) {
-                                       numblocks -= reserved_inos;
+                               if (inodes > reserved_inos) {
+                                       inodes -= reserved_inos;
                                        reserved_inos = 0;
                                } else {
-                                       reserved_inos -= numblocks;
-                                       numblocks = 0;
+                                       reserved_inos -= inodes;
+                                       inodes = 0;
                                }
                        }
-                       ext2fs_bg_itable_unused_set(fs, i, numblocks);
+                       ext2fs_bg_itable_unused_set(fs, i, inodes);
                }
-               numblocks = ext2fs_reserve_super_and_bgd(fs, i, fs->block_map);
-               if (fs->super->s_log_groups_per_flex)
+
+               if (!fs->super->s_log_groups_per_flex)
                        numblocks += 2 + fs->inode_blocks_per_group;
 
-               free_blocks += numblocks;
-               ext2fs_bg_free_blocks_count_set(fs, i, numblocks);
+               grp_free_blocks = ext2fs_group_blocks_count(fs, i) - numblocks;
+               free_blocks += grp_free_blocks;
+               ext2fs_bg_free_blocks_count_set(fs, i, grp_free_blocks);
                ext2fs_bg_free_inodes_count_set(fs, i, fs->super->s_inodes_per_group);
                ext2fs_bg_used_dirs_count_set(fs, i, 0);
                ext2fs_group_desc_csum_set(fs, i);
index c6e9784..bcee4c5 100644 (file)
@@ -3641,7 +3641,7 @@ no_journal:
                               fs->super->s_mmp_update_interval);
        }
 
-       overhead += fs->super->s_first_data_block;
+       overhead += EXT2FS_NUM_B2C(fs, fs->super->s_first_data_block);
        if (!super_only)
                fs->super->s_overhead_clusters = overhead;