Message ID | 20230417110617.2664129-14-shikemeng@huaweicloud.com |
---|---|
State | Superseded |
Headers | show |
Series | Fixes, cleanups and unit test for mballoc | expand |
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@huaweicloud.com> 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@linux.ibm.com> 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 >
on 5/14/2023 5:32 PM, Ojaswin Mujoo wrote: > 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@huaweicloud.com> > > 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); > ... > > } Yes, bitmap clear for BLOCK_UNINIT block group should not happen , I will add this in next version. Thanks for the suggestion.
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); } /**
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@huaweicloud.com> --- fs/ext4/mballoc.c | 37 +++++-------------------------------- 1 file changed, 5 insertions(+), 32 deletions(-)