On Wed 10-04-24 11:41:55, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@xxxxxxxxxx> > > Factor out a new common helper ext4_map_query_blocks() from the > ext4_da_map_blocks(), it query and return the extent map status on the > inode's extent path, no logic changes. > > Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/ext4/inode.c | 57 +++++++++++++++++++++++++++---------------------- > 1 file changed, 32 insertions(+), 25 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 537803250ca9..6a41172c06e1 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -453,6 +453,35 @@ static void ext4_map_blocks_es_recheck(handle_t *handle, > } > #endif /* ES_AGGRESSIVE_TEST */ > > +static int ext4_map_query_blocks(handle_t *handle, struct inode *inode, > + struct ext4_map_blocks *map) > +{ > + unsigned int status; > + int retval; > + > + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) > + retval = ext4_ext_map_blocks(handle, inode, map, 0); > + else > + retval = ext4_ind_map_blocks(handle, inode, map, 0); > + > + if (retval <= 0) > + return retval; > + > + if (unlikely(retval != map->m_len)) { > + ext4_warning(inode->i_sb, > + "ES len assertion failed for inode " > + "%lu: retval %d != map->m_len %d", > + inode->i_ino, retval, map->m_len); > + WARN_ON(1); > + } > + > + status = map->m_flags & EXT4_MAP_UNWRITTEN ? > + EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; > + ext4_es_insert_extent(inode, map->m_lblk, map->m_len, > + map->m_pblk, status); > + return retval; > +} > + > /* > * The ext4_map_blocks() function tries to look up the requested blocks, > * and returns if the blocks are already mapped. > @@ -1744,33 +1773,11 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, > down_read(&EXT4_I(inode)->i_data_sem); > if (ext4_has_inline_data(inode)) > retval = 0; > - else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) > - retval = ext4_ext_map_blocks(NULL, inode, map, 0); > else > - retval = ext4_ind_map_blocks(NULL, inode, map, 0); > - if (retval < 0) { > - up_read(&EXT4_I(inode)->i_data_sem); > - return retval; > - } > - if (retval > 0) { > - unsigned int status; > - > - if (unlikely(retval != map->m_len)) { > - ext4_warning(inode->i_sb, > - "ES len assertion failed for inode " > - "%lu: retval %d != map->m_len %d", > - inode->i_ino, retval, map->m_len); > - WARN_ON(1); > - } > - > - status = map->m_flags & EXT4_MAP_UNWRITTEN ? > - EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; > - ext4_es_insert_extent(inode, map->m_lblk, map->m_len, > - map->m_pblk, status); > - up_read(&EXT4_I(inode)->i_data_sem); > - return retval; > - } > + retval = ext4_map_query_blocks(NULL, inode, map); > up_read(&EXT4_I(inode)->i_data_sem); > + if (retval) > + return retval; > > add_delayed: > down_write(&EXT4_I(inode)->i_data_sem); > -- > 2.39.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR