On Mon 24-04-23 11:38:37, Baokun Li wrote: > Factor out __es_alloc_extent() and __es_free_extent(), which only allocate > and free extent_status in these two helpers. > > The ext4_es_alloc_extent() function is split into __es_alloc_extent() > and ext4_es_init_extent(). In __es_alloc_extent() we allocate memory using > GFP_KERNEL | __GFP_NOFAIL | __GFP_ZERO if the memory allocation cannot > fail, otherwise we use GFP_ATOMIC. and the ext4_es_init_extent() is used to > initialize extent_status and update related variables after a successful > allocation. > > This is to prepare for the use of pre-allocated extent_status later. > > Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/ext4/extents_status.c | 30 +++++++++++++++++++----------- > 1 file changed, 19 insertions(+), 11 deletions(-) > > diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c > index 573723b23d19..18665394392f 100644 > --- a/fs/ext4/extents_status.c > +++ b/fs/ext4/extents_status.c > @@ -461,14 +461,17 @@ static inline bool ext4_es_must_keep(struct extent_status *es) > return false; > } > > -static struct extent_status * > -ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, > - ext4_fsblk_t pblk) > +static inline struct extent_status *__es_alloc_extent(bool nofail) > +{ > + if (!nofail) > + return kmem_cache_alloc(ext4_es_cachep, GFP_ATOMIC); > + > + return kmem_cache_zalloc(ext4_es_cachep, GFP_KERNEL | __GFP_NOFAIL); > +} > + > +static void ext4_es_init_extent(struct inode *inode, struct extent_status *es, > + ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk) > { > - struct extent_status *es; > - es = kmem_cache_alloc(ext4_es_cachep, GFP_ATOMIC); > - if (es == NULL) > - return NULL; > es->es_lblk = lblk; > es->es_len = len; > es->es_pblk = pblk; > @@ -483,8 +486,11 @@ ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, > > EXT4_I(inode)->i_es_all_nr++; > percpu_counter_inc(&EXT4_SB(inode->i_sb)->s_es_stats.es_stats_all_cnt); > +} > > - return es; > +static inline void __es_free_extent(struct extent_status *es) > +{ > + kmem_cache_free(ext4_es_cachep, es); > } > > static void ext4_es_free_extent(struct inode *inode, struct extent_status *es) > @@ -501,7 +507,7 @@ static void ext4_es_free_extent(struct inode *inode, struct extent_status *es) > s_es_stats.es_stats_shk_cnt); > } > > - kmem_cache_free(ext4_es_cachep, es); > + __es_free_extent(es); > } > > /* > @@ -802,10 +808,12 @@ static int __es_insert_extent(struct inode *inode, struct extent_status *newes) > } > } > > - es = ext4_es_alloc_extent(inode, newes->es_lblk, newes->es_len, > - newes->es_pblk); > + es = __es_alloc_extent(false); > if (!es) > return -ENOMEM; > + ext4_es_init_extent(inode, es, newes->es_lblk, newes->es_len, > + newes->es_pblk); > + > rb_link_node(&es->rb_node, parent, p); > rb_insert_color(&es->rb_node, &tree->root); > > -- > 2.31.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR