@@ -2478,6 +2478,12 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
2478
2478
* This could return negative error code if something goes wrong
2479
2479
* during ext4_mb_init_group(). This should not be called with
2480
2480
* ext4_lock_group() held.
2481
+ *
2482
+ * Note: because we are conditionally operating with the group lock in
2483
+ * the EXT4_MB_STRICT_CHECK case, we need to fake out sparse in this
2484
+ * function using __acquire and __release. This means we need to be
2485
+ * super careful before messing with the error path handling via "goto
2486
+ * out"!
2481
2487
*/
2482
2488
static int ext4_mb_good_group_nolock (struct ext4_allocation_context * ac ,
2483
2489
ext4_group_t group , int cr )
@@ -2491,17 +2497,21 @@ static int ext4_mb_good_group_nolock(struct ext4_allocation_context *ac,
2491
2497
2492
2498
if (sbi -> s_mb_stats )
2493
2499
atomic64_inc (& sbi -> s_bal_cX_groups_considered [ac -> ac_criteria ]);
2494
- if (should_lock )
2500
+ if (should_lock ) {
2495
2501
ext4_lock_group (sb , group );
2502
+ __release (ext4_group_lock_ptr (sb , group ));
2503
+ }
2496
2504
free = grp -> bb_free ;
2497
2505
if (free == 0 )
2498
2506
goto out ;
2499
2507
if (cr <= 2 && free < ac -> ac_g_ex .fe_len )
2500
2508
goto out ;
2501
2509
if (unlikely (EXT4_MB_GRP_BBITMAP_CORRUPT (grp )))
2502
2510
goto out ;
2503
- if (should_lock )
2511
+ if (should_lock ) {
2512
+ __acquire (ext4_group_lock_ptr (sb , group ));
2504
2513
ext4_unlock_group (sb , group );
2514
+ }
2505
2515
2506
2516
/* We only do this if the grp has never been initialized */
2507
2517
if (unlikely (EXT4_MB_GRP_NEED_INIT (grp ))) {
@@ -2528,12 +2538,16 @@ static int ext4_mb_good_group_nolock(struct ext4_allocation_context *ac,
2528
2538
return ret ;
2529
2539
}
2530
2540
2531
- if (should_lock )
2541
+ if (should_lock ) {
2532
2542
ext4_lock_group (sb , group );
2543
+ __release (ext4_group_lock_ptr (sb , group ));
2544
+ }
2533
2545
ret = ext4_mb_good_group (ac , group , cr );
2534
2546
out :
2535
- if (should_lock )
2547
+ if (should_lock ) {
2548
+ __acquire (ext4_group_lock_ptr (sb , group ));
2536
2549
ext4_unlock_group (sb , group );
2550
+ }
2537
2551
return ret ;
2538
2552
}
2539
2553
@@ -2969,6 +2983,7 @@ int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset)
2969
2983
}
2970
2984
2971
2985
static void * ext4_mb_seq_structs_summary_start (struct seq_file * seq , loff_t * pos )
2986
+ __acquires (& EXT4_SB (sb )- > s_mb_rb_lock )
2972
2987
{
2973
2988
struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
2974
2989
unsigned long position ;
@@ -3041,6 +3056,7 @@ static int ext4_mb_seq_structs_summary_show(struct seq_file *seq, void *v)
3041
3056
}
3042
3057
3043
3058
static void ext4_mb_seq_structs_summary_stop (struct seq_file * seq , void * v )
3059
+ __releases (& EXT4_SB (sb )- > s_mb_rb_lock )
3044
3060
{
3045
3061
struct super_block * sb = PDE_DATA (file_inode (seq -> file ));
3046
3062
@@ -6275,6 +6291,8 @@ __acquires(bitlock)
6275
6291
static int ext4_try_to_trim_range (struct super_block * sb ,
6276
6292
struct ext4_buddy * e4b , ext4_grpblk_t start ,
6277
6293
ext4_grpblk_t max , ext4_grpblk_t minblocks )
6294
+ __acquires (ext4_group_lock_ptr (sb , e4b - > bd_group ))
6295
+ __releases (ext4_group_lock_ptr (sb , e4b - > bd_group ))
6278
6296
{
6279
6297
ext4_grpblk_t next , count , free_count ;
6280
6298
void * bitmap ;
0 commit comments