Re: [PATCH v5 09/17] vfs: clean up argument list for vfs_create()

Jan Kara <[email protected]>
Newsgroups org.kernel.vger.ecryptfs,dev.linux.lists.netfs,org.kernel.vger.linux-cifs,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs,org.kernel.vger.linux-unionfs,org.kernel.vger.linux-xfs,org.kernel.vger.netdev
Message-ID <g3si4zuuhxleat2gkebyhnokq5eiymatgi36ad25datcbvinfs@nsk4fop6sz5f>
On Wed 05-11-25 11:53:55, Jeff Layton wrote:
> As Neil points out:
> 
> "I would be in favour of dropping the "dir" arg because it is always
> d_inode(dentry->d_parent) which is stable."
> 
> ...and...
> 
> "Also *every* caller of vfs_create() passes ".excl = true".  So maybe we
> don't need that arg at all."
> 
> Drop both arguments from vfs_create() and fix up the callers.
> 
> Suggested-by: NeilBrown <[email protected]>
> Signed-off-by: Jeff Layton <[email protected]>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <[email protected]>

								Honza

> ---
>  fs/ecryptfs/inode.c      |  3 +--
>  fs/namei.c               | 11 ++++-------
>  fs/nfsd/nfs3proc.c       |  2 +-
>  fs/nfsd/vfs.c            |  3 +--
>  fs/open.c                |  4 +---
>  fs/overlayfs/overlayfs.h |  2 +-
>  fs/smb/server/vfs.c      |  3 +--
>  include/linux/fs.h       |  3 +--
>  8 files changed, 11 insertions(+), 20 deletions(-)
> 
> diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
> index 88631291b32535f623a3fbe4ea9b6ed48a306ca0..d109e3763a88150bfe64cd2d5564dc9802ef3386 100644
> --- a/fs/ecryptfs/inode.c
> +++ b/fs/ecryptfs/inode.c
> @@ -188,8 +188,7 @@ ecryptfs_do_create(struct inode *directory_inode,
>  
>  	rc = lock_parent(ecryptfs_dentry, &lower_dentry, &lower_dir);
>  	if (!rc)
> -		rc = vfs_create(&nop_mnt_idmap, lower_dir,
> -				lower_dentry, mode, true);
> +		rc = vfs_create(&nop_mnt_idmap, lower_dentry, mode);
>  	if (rc) {
>  		printk(KERN_ERR "%s: Failure to create dentry in lower fs; "
>  		       "rc = [%d]\n", __func__, rc);
> diff --git a/fs/namei.c b/fs/namei.c
> index f439429bdfa271ccc64c937771ef4175597feb53..9586c6aba6eae05a9fc3c103b8501d98767bef53 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -3461,10 +3461,8 @@ static inline umode_t vfs_prepare_mode(struct mnt_idmap *idmap,
>  /**
>   * vfs_create - create new file
>   * @idmap:	idmap of the mount the inode was found from
> - * @dir:	inode of the parent directory
>   * @dentry:	dentry of the child file
>   * @mode:	mode of the child file
> - * @want_excl:	whether the file must not yet exist
>   *
>   * Create a new file.
>   *
> @@ -3474,9 +3472,9 @@ static inline umode_t vfs_prepare_mode(struct mnt_idmap *idmap,
>   * On non-idmapped mounts or if permission checking is to be performed on the
>   * raw inode simply pass @nop_mnt_idmap.
>   */
> -int vfs_create(struct mnt_idmap *idmap, struct inode *dir,
> -	       struct dentry *dentry, umode_t mode, bool want_excl)
> +int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode)
>  {
> +	struct inode *dir = d_inode(dentry->d_parent);
>  	int error;
>  
>  	error = may_create(idmap, dir, dentry);
> @@ -3490,7 +3488,7 @@ int vfs_create(struct mnt_idmap *idmap, struct inode *dir,
>  	error = security_inode_create(dir, dentry, mode);
>  	if (error)
>  		return error;
> -	error = dir->i_op->create(idmap, dir, dentry, mode, want_excl);
> +	error = dir->i_op->create(idmap, dir, dentry, mode, true);
>  	if (!error)
>  		fsnotify_create(dir, dentry);
>  	return error;
> @@ -4383,8 +4381,7 @@ static int do_mknodat(int dfd, struct filename *name, umode_t mode,
>  	idmap = mnt_idmap(path.mnt);
>  	switch (mode & S_IFMT) {
>  		case 0: case S_IFREG:
> -			error = vfs_create(idmap, path.dentry->d_inode,
> -					   dentry, mode, true);
> +			error = vfs_create(idmap, dentry, mode);
>  			if (!error)
>  				security_path_post_mknod(idmap, dentry);
>  			break;
> diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
> index b6d03e1ef5f7a5e8dd111b0d56c061f1e91abff7..30ea7ffa2affdb9a959b0fd15a630de056d6dc3c 100644
> --- a/fs/nfsd/nfs3proc.c
> +++ b/fs/nfsd/nfs3proc.c
> @@ -344,7 +344,7 @@ nfsd3_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
>  	status = fh_fill_pre_attrs(fhp);
>  	if (status != nfs_ok)
>  		goto out;
> -	host_err = vfs_create(&nop_mnt_idmap, inode, child, iap->ia_mode, true);
> +	host_err = vfs_create(&nop_mnt_idmap, child, iap->ia_mode);
>  	if (host_err < 0) {
>  		status = nfserrno(host_err);
>  		goto out;
> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> index c400ea94ff2e837fd59719bf2c4b79ef1d064743..464fd54675f3b16fce9ae5f05ad22e0e6b363eb3 100644
> --- a/fs/nfsd/vfs.c
> +++ b/fs/nfsd/vfs.c
> @@ -1552,8 +1552,7 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
>  	err = 0;
>  	switch (type) {
>  	case S_IFREG:
> -		host_err = vfs_create(&nop_mnt_idmap, dirp, dchild,
> -				      iap->ia_mode, true);
> +		host_err = vfs_create(&nop_mnt_idmap, dchild, iap->ia_mode);
>  		if (!host_err)
>  			nfsd_check_ignore_resizing(iap);
>  		break;
> diff --git a/fs/open.c b/fs/open.c
> index fdaa6f08f6f4cac5c2fefd3eafa5e430e51f3979..e440f58e3ce81e137aabdf00510d839342a19219 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1171,9 +1171,7 @@ struct file *dentry_create(const struct path *path, int flags, umode_t mode,
>  	if (IS_ERR(f))
>  		return f;
>  
> -	error = vfs_create(mnt_idmap(path->mnt),
> -			   d_inode(path->dentry->d_parent),
> -			   path->dentry, mode, true);
> +	error = vfs_create(mnt_idmap(path->mnt), path->dentry, mode);
>  	if (!error)
>  		error = vfs_open(path, f);
>  
> diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
> index d215d7349489686b66bb66e939b27046f7d836f6..2bdc434941ebc70f6d4f57cca4f68125112a7bc4 100644
> --- a/fs/overlayfs/overlayfs.h
> +++ b/fs/overlayfs/overlayfs.h
> @@ -235,7 +235,7 @@ static inline int ovl_do_create(struct ovl_fs *ofs,
>  				struct inode *dir, struct dentry *dentry,
>  				umode_t mode)
>  {
> -	int err = vfs_create(ovl_upper_mnt_idmap(ofs), dir, dentry, mode, true);
> +	int err = vfs_create(ovl_upper_mnt_idmap(ofs), dentry, mode);
>  
>  	pr_debug("create(%pd2, 0%o) = %i\n", dentry, mode, err);
>  	return err;
> diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
> index c5f0f3170d586cb2dc4d416b80948c642797fb82..83ece2de4b23bf9209137e7ca414a72439b5cc2e 100644
> --- a/fs/smb/server/vfs.c
> +++ b/fs/smb/server/vfs.c
> @@ -188,8 +188,7 @@ int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode)
>  	}
>  
>  	mode |= S_IFREG;
> -	err = vfs_create(mnt_idmap(path.mnt), d_inode(path.dentry),
> -			 dentry, mode, true);
> +	err = vfs_create(mnt_idmap(path.mnt), dentry, mode);
>  	if (!err) {
>  		ksmbd_vfs_inherit_owner(work, d_inode(path.dentry),
>  					d_inode(dentry));
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 12873214e1c7811735ea5d2dee3d57e2a5604d8f..21876ef1fec90181b9878372c7c7e710773aae9f 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2111,8 +2111,7 @@ bool inode_owner_or_capable(struct mnt_idmap *idmap,
>  /*
>   * VFS helper functions..
>   */
> -int vfs_create(struct mnt_idmap *, struct inode *,
> -	       struct dentry *, umode_t, bool);
> +int vfs_create(struct mnt_idmap *, struct dentry *, umode_t);
>  struct dentry *vfs_mkdir(struct mnt_idmap *, struct inode *,
>  			 struct dentry *, umode_t, struct delegated_inode *);
>  int vfs_mknod(struct mnt_idmap *, struct inode *, struct dentry *,
> 
> -- 
> 2.51.1
> 
-- 
Jan Kara <[email protected]>
SUSE Labs, CR
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.