]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: factor out __ext4_mb_scan_group()
authorBaokun Li <libaokun1@huawei.com>
Mon, 14 Jul 2025 13:03:22 +0000 (21:03 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 25 Jul 2025 13:14:17 +0000 (09:14 -0400)
Extract __ext4_mb_scan_group() to make the code clearer and to
prepare for the later conversion of 'choose group' to 'scan groups'.
No functional changes.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Zhang Yi <yi.zhang@huawei.com>
Link: https://patch.msgid.link/20250714130327.1830534-13-libaokun1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mballoc.c
fs/ext4/mballoc.h

index fada0d1b3fdb21ff392d1853adbcd7dd7476e862..650eb6366eb04a54268dd9b111129f8373a3b310 100644 (file)
@@ -2568,6 +2568,30 @@ void ext4_mb_scan_aligned(struct ext4_allocation_context *ac,
        }
 }
 
+static void __ext4_mb_scan_group(struct ext4_allocation_context *ac)
+{
+       bool is_stripe_aligned;
+       struct ext4_sb_info *sbi;
+       enum criteria cr = ac->ac_criteria;
+
+       ac->ac_groups_scanned++;
+       if (cr == CR_POWER2_ALIGNED)
+               return ext4_mb_simple_scan_group(ac, ac->ac_e4b);
+
+       sbi = EXT4_SB(ac->ac_sb);
+       is_stripe_aligned = false;
+       if ((sbi->s_stripe >= sbi->s_cluster_ratio) &&
+           !(ac->ac_g_ex.fe_len % EXT4_NUM_B2C(sbi, sbi->s_stripe)))
+               is_stripe_aligned = true;
+
+       if ((cr == CR_GOAL_LEN_FAST || cr == CR_BEST_AVAIL_LEN) &&
+           is_stripe_aligned)
+               ext4_mb_scan_aligned(ac, ac->ac_e4b);
+
+       if (ac->ac_status == AC_STATUS_CONTINUE)
+               ext4_mb_complex_scan_group(ac, ac->ac_e4b);
+}
+
 /*
  * This is also called BEFORE we load the buddy bitmap.
  * Returns either 1 or 0 indicating that the group is either suitable
@@ -2855,6 +2879,8 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
         */
        if (ac->ac_2order)
                cr = CR_POWER2_ALIGNED;
+
+       ac->ac_e4b = &e4b;
 repeat:
        for (; cr < EXT4_MB_NUM_CRS && ac->ac_status == AC_STATUS_CONTINUE; cr++) {
                ac->ac_criteria = cr;
@@ -2932,24 +2958,7 @@ repeat:
                                continue;
                        }
 
-                       ac->ac_groups_scanned++;
-                       if (cr == CR_POWER2_ALIGNED)
-                               ext4_mb_simple_scan_group(ac, &e4b);
-                       else {
-                               bool is_stripe_aligned =
-                                       (sbi->s_stripe >=
-                                        sbi->s_cluster_ratio) &&
-                                       !(ac->ac_g_ex.fe_len %
-                                         EXT4_NUM_B2C(sbi, sbi->s_stripe));
-
-                               if ((cr == CR_GOAL_LEN_FAST ||
-                                    cr == CR_BEST_AVAIL_LEN) &&
-                                   is_stripe_aligned)
-                                       ext4_mb_scan_aligned(ac, &e4b);
-
-                               if (ac->ac_status == AC_STATUS_CONTINUE)
-                                       ext4_mb_complex_scan_group(ac, &e4b);
-                       }
+                       __ext4_mb_scan_group(ac);
 
                        ext4_unlock_group(sb, group);
                        ext4_mb_unload_buddy(&e4b);
index f8280de3e8820a639e775fafc40cde6030575814..7a60b0103e64981ed211861d3133e2e2e2cdb6a7 100644 (file)
@@ -204,6 +204,8 @@ struct ext4_allocation_context {
        __u8 ac_2order;         /* if request is to allocate 2^N blocks and
                                 * N > 0, the field stores N, otherwise 0 */
        __u8 ac_op;             /* operation, for history only */
+
+       struct ext4_buddy *ac_e4b;
        struct folio *ac_bitmap_folio;
        struct folio *ac_buddy_folio;
        struct ext4_prealloc_space *ac_pa;