On Thu 21-12-23 23:05:56, Baokun Li wrote: > Determine if the group block bitmap is corrupted before using ac_b_ex in > ext4_mb_try_best_found() to avoid allocating blocks from a group with a > corrupted block bitmap in the following concurrency and making the > situation worse. > > ext4_mb_regular_allocator > ext4_lock_group(sb, group) > ext4_mb_good_group > // check if the group bbitmap is corrupted > ext4_mb_complex_scan_group > // Scan group gets ac_b_ex but doesn't use it > ext4_unlock_group(sb, group) > ext4_mark_group_bitmap_corrupted(group) > // The block bitmap was corrupted during > // the group unlock gap. > ext4_mb_try_best_found > ext4_lock_group(ac->ac_sb, group) > ext4_mb_use_best_found > mb_mark_used > // Allocating blocks in block bitmap corrupted group > > Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/ext4/mballoc.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index 03500aec43ac..2bb29f0077bd 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -2303,6 +2303,9 @@ void ext4_mb_try_best_found(struct ext4_allocation_context *ac, > return; > > ext4_lock_group(ac->ac_sb, group); > + if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(e4b->bd_info))) > + goto out; > + > max = mb_find_extent(e4b, ex.fe_start, ex.fe_len, &ex); > > if (max > 0) { > @@ -2310,6 +2313,7 @@ void ext4_mb_try_best_found(struct ext4_allocation_context *ac, > ext4_mb_use_best_found(ac, e4b); > } > > +out: > ext4_unlock_group(ac->ac_sb, group); > ext4_mb_unload_buddy(e4b); > } > -- > 2.31.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR