mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
ext4: pass out extent seq counter when mapping blocks
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@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Message-ID: <20251013015128.499308-5-yi.zhang@huaweicloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
@@ -260,6 +260,7 @@ struct ext4_map_blocks {
|
||||
ext4_lblk_t m_lblk;
|
||||
unsigned int m_len;
|
||||
unsigned int m_flags;
|
||||
u64 m_seq;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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 @@ add_delayed:
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user