mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 13:47:40 -05:00
ext4: ext4: unify EXT4_EX_NOCACHE|NOFAIL flags in ext4_ext_remove_space()
When removing space, we should use EXT4_EX_NOCACHE because we don't need to cache extents, and we should also use EXT4_EX_NOFAIL to prevent metadata inconsistencies that may arise from memory allocation failures. While ext4_ext_remove_space() already uses these two flags in most places, they are missing in ext4_ext_search_right() and read_extent_tree_block() calls. Unify the flags to ensure consistent behavior throughout the extent removal process. Signed-off-by: Zhang Yi <yi.zhang@huawei.com> Link: https://patch.msgid.link/20250423085257.122685-2-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
@@ -1530,7 +1530,7 @@ static int ext4_ext_search_left(struct inode *inode,
|
||||
static int ext4_ext_search_right(struct inode *inode,
|
||||
struct ext4_ext_path *path,
|
||||
ext4_lblk_t *logical, ext4_fsblk_t *phys,
|
||||
struct ext4_extent *ret_ex)
|
||||
struct ext4_extent *ret_ex, int flags)
|
||||
{
|
||||
struct buffer_head *bh = NULL;
|
||||
struct ext4_extent_header *eh;
|
||||
@@ -1604,7 +1604,8 @@ static int ext4_ext_search_right(struct inode *inode,
|
||||
ix++;
|
||||
while (++depth < path->p_depth) {
|
||||
/* subtract from p_depth to get proper eh_depth */
|
||||
bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0);
|
||||
bh = read_extent_tree_block(inode, ix, path->p_depth - depth,
|
||||
flags);
|
||||
if (IS_ERR(bh))
|
||||
return PTR_ERR(bh);
|
||||
eh = ext_block_hdr(bh);
|
||||
@@ -1612,7 +1613,7 @@ static int ext4_ext_search_right(struct inode *inode,
|
||||
put_bh(bh);
|
||||
}
|
||||
|
||||
bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0);
|
||||
bh = read_extent_tree_block(inode, ix, path->p_depth - depth, flags);
|
||||
if (IS_ERR(bh))
|
||||
return PTR_ERR(bh);
|
||||
eh = ext_block_hdr(bh);
|
||||
@@ -2821,6 +2822,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
struct partial_cluster partial;
|
||||
handle_t *handle;
|
||||
int i = 0, err = 0;
|
||||
int flags = EXT4_EX_NOCACHE | EXT4_EX_NOFAIL;
|
||||
|
||||
partial.pclu = 0;
|
||||
partial.lblk = 0;
|
||||
@@ -2851,8 +2853,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
ext4_fsblk_t pblk;
|
||||
|
||||
/* find extent for or closest extent to this block */
|
||||
path = ext4_find_extent(inode, end, NULL,
|
||||
EXT4_EX_NOCACHE | EXT4_EX_NOFAIL);
|
||||
path = ext4_find_extent(inode, end, NULL, flags);
|
||||
if (IS_ERR(path)) {
|
||||
ext4_journal_stop(handle);
|
||||
return PTR_ERR(path);
|
||||
@@ -2918,7 +2919,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
*/
|
||||
lblk = ex_end + 1;
|
||||
err = ext4_ext_search_right(inode, path, &lblk, &pblk,
|
||||
NULL);
|
||||
NULL, flags);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
if (pblk) {
|
||||
@@ -2994,8 +2995,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
i + 1, ext4_idx_pblock(path[i].p_idx));
|
||||
memset(path + i + 1, 0, sizeof(*path));
|
||||
bh = read_extent_tree_block(inode, path[i].p_idx,
|
||||
depth - i - 1,
|
||||
EXT4_EX_NOCACHE);
|
||||
depth - i - 1, flags);
|
||||
if (IS_ERR(bh)) {
|
||||
/* should we reset i_size? */
|
||||
err = PTR_ERR(bh);
|
||||
@@ -4314,7 +4314,8 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
|
||||
if (err)
|
||||
goto out;
|
||||
ar.lright = map->m_lblk;
|
||||
err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright, &ex2);
|
||||
err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright,
|
||||
&ex2, 0);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user