[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <uugyelukqaxxipbrdrldvr37eoqn5uqc4x7jhvex6vbdaswgnl@wcwjbfcglxna>
Date: Wed, 8 Oct 2025 13:36:43 +0200
From: Jan Kara <jack@...e.cz>
To: Zhang Yi <yi.zhang@...weicloud.com>
Cc: linux-ext4@...r.kernel.org, linux-fsdevel@...r.kernel.org,
linux-kernel@...r.kernel.org, tytso@....edu, adilger.kernel@...ger.ca, jack@...e.cz,
yi.zhang@...wei.com, libaokun1@...wei.com, yukuai3@...wei.com, yangerkun@...wei.com
Subject: Re: [PATCH v2 05/13] ext4: pass out extent seq counter when mapping
blocks
On Thu 25-09-25 17:26:01, Zhang Yi wrote:
> From: Zhang Yi <yi.zhang@...wei.com>
>
> When creating or querying mapping blocks using the ext4_map_blocks() and
> ext4_map_{query|create}_blocks() helpers, also pass out the extent
> sequence number of the block mapping info through the ext4_map_blocks
> structure. This sequence number can later serve as a valid cookie within
> iomap infrastructure and the move extents procedure.
>
> Signed-off-by: Zhang Yi <yi.zhang@...wei.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@...e.cz>
Honza
> ---
> fs/ext4/ext4.h | 1 +
> fs/ext4/inode.c | 24 ++++++++++++++++--------
> 2 files changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 7b37a661dd37..7f452895ec09 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -260,6 +260,7 @@ struct ext4_map_blocks {
> ext4_lblk_t m_lblk;
> unsigned int m_len;
> unsigned int m_flags;
> + u64 m_seq;
> };
>
> /*
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index c7fac4b89c88..d005a4f3f4b3 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -550,10 +550,13 @@ static int ext4_map_query_blocks(handle_t *handle, struct inode *inode,
> retval = ext4_ext_map_blocks(handle, inode, map, flags);
> else
> retval = ext4_ind_map_blocks(handle, inode, map, flags);
> -
> - if (retval <= 0)
> + if (retval < 0)
> return retval;
>
> + /* A hole? */
> + if (retval == 0)
> + goto out;
> +
> if (unlikely(retval != map->m_len)) {
> ext4_warning(inode->i_sb,
> "ES len assertion failed for inode "
> @@ -573,11 +576,13 @@ static int ext4_map_query_blocks(handle_t *handle, struct inode *inode,
> EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
> ext4_es_insert_extent(inode, map->m_lblk, map->m_len,
> map->m_pblk, status, false);
> - return retval;
> + } else {
> + retval = ext4_map_query_blocks_next_in_leaf(handle, inode, map,
> + orig_mlen);
> }
> -
> - return ext4_map_query_blocks_next_in_leaf(handle, inode, map,
> - orig_mlen);
> +out:
> + map->m_seq = READ_ONCE(EXT4_I(inode)->i_es_seq);
> + return retval;
> }
>
> static int ext4_map_create_blocks(handle_t *handle, struct inode *inode,
> @@ -649,7 +654,7 @@ static int ext4_map_create_blocks(handle_t *handle, struct inode *inode,
> * extent status tree.
> */
> if (flags & EXT4_GET_BLOCKS_PRE_IO &&
> - ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es, NULL)) {
> + ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es, &map->m_seq)) {
> if (ext4_es_is_written(&es))
> return retval;
> }
> @@ -658,6 +663,7 @@ static int ext4_map_create_blocks(handle_t *handle, struct inode *inode,
> EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
> ext4_es_insert_extent(inode, map->m_lblk, map->m_len, map->m_pblk,
> status, flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE);
> + map->m_seq = READ_ONCE(EXT4_I(inode)->i_es_seq);
>
> return retval;
> }
> @@ -723,7 +729,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
> ext4_check_map_extents_env(inode);
>
> /* Lookup extent status tree firstly */
> - if (ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es, NULL)) {
> + if (ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es, &map->m_seq)) {
> if (ext4_es_is_written(&es) || ext4_es_is_unwritten(&es)) {
> map->m_pblk = ext4_es_pblock(&es) +
> map->m_lblk - es.es_lblk;
> @@ -1979,6 +1985,8 @@ static int ext4_da_map_blocks(struct inode *inode, struct ext4_map_blocks *map)
>
> map->m_flags |= EXT4_MAP_DELAYED;
> retval = ext4_insert_delayed_blocks(inode, map->m_lblk, map->m_len);
> + if (!retval)
> + map->m_seq = READ_ONCE(EXT4_I(inode)->i_es_seq);
> up_write(&EXT4_I(inode)->i_data_sem);
>
> return retval;
> --
> 2.46.1
>
--
Jan Kara <jack@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists