Whamcloud - gitweb
mke2fs: set free blocks accurately for groups has GDT
authorLi Dongyang <dongyangli@ddn.com>
Mon, 25 Sep 2023 06:08:00 +0000 (16:08 +1000)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 4 Apr 2024 14:49:09 +0000 (10:49 -0400)
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.

Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Link: https://lore.kernel.org/r/20230925060801.1397581-1-dongyangli@ddn.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/alloc_sb.c
lib/ext2fs/ext2fs.h
lib/ext2fs/gen_bitmap64.c
lib/ext2fs/initialize.c
lib/ext2fs/openfs.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 9cea4b6..e043551 100644 (file)
@@ -847,6 +847,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,
@@ -1535,6 +1539,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 4289e81..5936dcf 100644 (file)
@@ -945,8 +945,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;
@@ -976,6 +976,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 d5f9a0f..e5286a0 100644 (file)
@@ -524,6 +524,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.
@@ -533,24 +542,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 fd56a9a..c3611e0 100644 (file)
@@ -330,13 +330,13 @@ retry:
        }
 
        /* Enforce the block group descriptor size */
-       if (!(flags & EXT2_FLAG_IGNORE_SB_ERRORS) &&
-           ext2fs_has_feature_64bit(fs->super)) {
+       if (ext2fs_has_feature_64bit(fs->super)) {
                unsigned desc_size = fs->super->s_desc_size;
 
-               if ((desc_size < EXT2_MIN_DESC_SIZE_64BIT) ||
-                   (desc_size > EXT2_MAX_DESC_SIZE) ||
-                   (desc_size & (desc_size - 1)) != 0) {
+               if (desc_size < EXT2_MIN_DESC_SIZE_64BIT ||
+                   (!(flags & EXT2_FLAG_IGNORE_SB_ERRORS) &&
+                    ((desc_size > EXT2_MAX_DESC_SIZE) ||
+                     (desc_size & (desc_size - 1)) != 0))) {
                        retval = EXT2_ET_BAD_DESC_SIZE;
                        goto cleanup;
                }
index aebf050..1c5de68 100644 (file)
@@ -3546,7 +3546,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;