Re: [PATCH 21/21] configfs:get_target() - release path as soon as we grab configfs_item reference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat 06-09-25 10:11:37, Al Viro wrote:
> ... and get rid of path argument - it turns into a local variable in get_target()
> 
> Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack@xxxxxxx>

								Honza

> ---
>  fs/configfs/symlink.c | 33 +++++++++++++--------------------
>  1 file changed, 13 insertions(+), 20 deletions(-)
> 
> diff --git a/fs/configfs/symlink.c b/fs/configfs/symlink.c
> index 69133ec1fac2..f3f79c67add5 100644
> --- a/fs/configfs/symlink.c
> +++ b/fs/configfs/symlink.c
> @@ -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);
> -- 
> 2.47.2
> 
-- 
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux