]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: ext4: unify EXT4_EX_NOCACHE|NOFAIL flags in ext4_ext_remove_space()
authorZhang Yi <yi.zhang@huawei.com>
Wed, 23 Apr 2025 08:52:49 +0000 (16:52 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 14 May 2025 14:42:12 +0000 (10:42 -0400)
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>
fs/ext4/extents.c

index c616a16a9f36d3001a66cd8cfc809efd73b1843b..d8eac736cc9a00c93140b0436e4e18c171e330a2 100644 (file)
@@ -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 @@ got_index:
        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 @@ got_index:
                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 @@ again:
                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 @@ again:
                         */
                        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 @@ again:
                                  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;