On Mon, Apr 17, 2023 at 07:06:11PM +0800, Kemeng Shi wrote: > call ext4_mb_mark_group_bb in ext4_free_blocks_simple to: > 1. remove repeat code > 2. pair update of free_clusters in ext4_mb_new_blocks_simple. > 3. add missing ext4_lock_group/ext4_unlock_group protection. > > Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> Correct me if I'm wrong but I think we will never try to clear bitmap bits for a BLOCK_UNINIT BG right. Maybe if that's the case we can add a WARN_ON as follows in ext4_mb_mark_group_bb(): if (ext4_has_group_desc_csum(sb) && (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))) { WARN_ON(mc->state == 0); ... } Other than that the patch looks good, feel free to add: Reviewed-by: Ojaswin Mujoo <ojaswin@xxxxxxxxxxxxx> Regards, ojaswin > --- > fs/ext4/mballoc.c | 37 +++++-------------------------------- > 1 file changed, 5 insertions(+), 32 deletions(-) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index ba165dc07890..623508115d98 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -6063,43 +6063,16 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, > static void ext4_free_blocks_simple(struct inode *inode, ext4_fsblk_t block, > unsigned long count) > { > - struct buffer_head *bitmap_bh; > + struct ext4_mark_context mc = { > + .sb = inode->i_sb, > + .state = 0, > + }; > struct super_block *sb = inode->i_sb; > - struct ext4_group_desc *gdp; > - struct buffer_head *gdp_bh; > ext4_group_t group; > ext4_grpblk_t blkoff; > - int already_freed = 0, err, i; > > ext4_get_group_no_and_offset(sb, block, &group, &blkoff); > - bitmap_bh = ext4_read_block_bitmap(sb, group); > - if (IS_ERR(bitmap_bh)) { > - pr_warn("Failed to read block bitmap\n"); > - return; > - } > - gdp = ext4_get_group_desc(sb, group, &gdp_bh); > - if (!gdp) > - goto err_out; > - > - for (i = 0; i < count; i++) { > - if (!mb_test_bit(blkoff + i, bitmap_bh->b_data)) > - already_freed++; > - } > - mb_clear_bits(bitmap_bh->b_data, blkoff, count); > - err = ext4_handle_dirty_metadata(NULL, NULL, bitmap_bh); > - if (err) > - goto err_out; > - ext4_free_group_clusters_set( > - sb, gdp, ext4_free_group_clusters(sb, gdp) + > - count - already_freed); > - ext4_block_bitmap_csum_set(sb, gdp, bitmap_bh); > - ext4_group_desc_csum_set(sb, group, gdp); > - ext4_handle_dirty_metadata(NULL, NULL, gdp_bh); > - sync_dirty_buffer(bitmap_bh); > - sync_dirty_buffer(gdp_bh); > - > -err_out: > - brelse(bitmap_bh); > + ext4_mb_mark_group_bb(&mc, group, blkoff, count); > } > > /** > -- > 2.30.0 >