]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: don't search back for dir inode item in INO_LOOKUP_USER
authorJosef Bacik <josef@toxicpanda.com>
Tue, 18 Nov 2025 16:08:43 +0000 (17:08 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 25 Nov 2025 00:53:27 +0000 (01:53 +0100)
We don't need to search back to the inode item, the directory inode
number is in key.offset, so simply use that.  If we can't find the
directory we'll get an ENOENT at the iget().

Note: The patch was taken from v5 of fscrypt patchset
(https://lore.kernel.org/linux-btrfs/cover.1706116485.git.josef@toxicpanda.com/)
which was handled over time by various people: Omar Sandoval, Sweet Tea
Dorminy, Josef Bacik.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Daniel Vacek <neelx@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add note ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ioctl.c

index a10b60439718696799821fe6ced531d7f419072f..4513c236d28129f9869150be5027b5ef13824662 100644 (file)
@@ -1822,7 +1822,7 @@ static int btrfs_search_path_in_tree_user(struct mnt_idmap *idmap,
        struct btrfs_root_ref *rref;
        struct btrfs_root *root = NULL;
        struct btrfs_path *path;
-       struct btrfs_key key, key2;
+       struct btrfs_key key;
        struct extent_buffer *leaf;
        char *ptr;
        int slot;
@@ -1877,24 +1877,6 @@ static int btrfs_search_path_in_tree_user(struct mnt_idmap *idmap,
                        read_extent_buffer(leaf, ptr,
                                        (unsigned long)(iref + 1), len);
 
-                       /* Check the read+exec permission of this directory */
-                       ret = btrfs_previous_item(root, path, dirid,
-                                                 BTRFS_INODE_ITEM_KEY);
-                       if (ret < 0) {
-                               goto out_put;
-                       } else if (ret > 0) {
-                               ret = -ENOENT;
-                               goto out_put;
-                       }
-
-                       leaf = path->nodes[0];
-                       slot = path->slots[0];
-                       btrfs_item_key_to_cpu(leaf, &key2, slot);
-                       if (key2.objectid != dirid) {
-                               ret = -ENOENT;
-                               goto out_put;
-                       }
-
                        /*
                         * We don't need the path anymore, so release it and
                         * avoid deadlocks and lockdep warnings in case
@@ -1902,11 +1884,12 @@ static int btrfs_search_path_in_tree_user(struct mnt_idmap *idmap,
                         * btree and lock the same leaf.
                         */
                        btrfs_release_path(path);
-                       temp_inode = btrfs_iget(key2.objectid, root);
+                       temp_inode = btrfs_iget(key.offset, root);
                        if (IS_ERR(temp_inode)) {
                                ret = PTR_ERR(temp_inode);
                                goto out_put;
                        }
+                       /* Check the read+exec permission of this directory. */
                        ret = inode_permission(idmap, &temp_inode->vfs_inode,
                                               MAY_READ | MAY_EXEC);
                        iput(&temp_inode->vfs_inode);