Re: [PATCH v2 1/9] ext4: factor out a common helper to query extent map

Jan Kara
2024-04-24T20:05:53Z

On Wed 10-04-24 11:41:55, Zhang Yi wrote:
> From: Zhang Yi <yi.zhang@huawei.com>
>
> 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@huawei.com>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

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@suse.com>
SUSE Labs, CR