]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
configfs:get_target() - release path as soon as we grab configfs_item reference
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 5 Sep 2025 01:47:50 +0000 (21:47 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 16 Sep 2025 01:17:10 +0000 (21:17 -0400)
... and get rid of path argument - it turns into a local variable in get_target()

Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/configfs/symlink.c

index 69133ec1fac2a854241c2a08a3b48c4c2e8d5c24..f3f79c67add5df5f5b628fa77311cd723fb34eac 100644 (file)
@@ -114,26 +114,21 @@ static int create_link(struct config_item *parent_item,
 }
 
 
-static int get_target(const char *symname, struct path *path,
-                     struct config_item **target, struct super_block *sb)
+static int get_target(const char *symname, struct config_item **target,
+                     struct super_block *sb)
 {
+       struct path path __free(path_put) = {};
        int ret;
 
-       ret = kern_path(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, path);
-       if (!ret) {
-               if (path->dentry->d_sb == sb) {
-                       *target = configfs_get_config_item(path->dentry);
-                       if (!*target) {
-                               ret = -ENOENT;
-                               path_put(path);
-                       }
-               } else {
-                       ret = -EPERM;
-                       path_put(path);
-               }
-       }
-
-       return ret;
+       ret = kern_path(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &path);
+       if (ret)
+               return ret;
+       if (path.dentry->d_sb != sb)
+               return -EPERM;
+       *target = configfs_get_config_item(path.dentry);
+       if (!*target)
+               return -ENOENT;
+       return 0;
 }
 
 
@@ -141,7 +136,6 @@ int configfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
                     struct dentry *dentry, const char *symname)
 {
        int ret;
-       struct path path;
        struct configfs_dirent *sd;
        struct config_item *parent_item;
        struct config_item *target_item = NULL;
@@ -188,7 +182,7 @@ int configfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
         *  AV, a thoroughly annoyed bastard.
         */
        inode_unlock(dir);
-       ret = get_target(symname, &path, &target_item, dentry->d_sb);
+       ret = get_target(symname, &target_item, dentry->d_sb);
        inode_lock(dir);
        if (ret)
                goto out_put;
@@ -210,7 +204,6 @@ int configfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
        }
 
        config_item_put(target_item);
-       path_put(&path);
 
 out_put:
        config_item_put(parent_item);