Message ID | 20231221150558.2740823-7-libaokun1@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | ext4: fix divide error in mb_update_avg_fragment_size() | expand |
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@huawei.com> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> 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 >
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); }
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@huawei.com> --- fs/ext4/mballoc.c | 4 ++++ 1 file changed, 4 insertions(+)