Linux NFS development
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: NeilBrown <neil@brown.name>, Chuck Lever <chuck.lever@oracle.com>
Cc: Olga Kornievskaia <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>,  Tom Talpey <tom@talpey.com>,
	linux-nfs@vger.kernel.org
Subject: Re: [PATCH v2 13/14] nfsd: separate out VFS-specific from from nfsd4_create_file()
Date: Mon, 06 Jul 2026 12:00:49 -0400	[thread overview]
Message-ID: <6f9f29157871d413bcef1531653b2d6811d8aa02.camel@kernel.org> (raw)
In-Reply-To: <20260705222032.1240057-14-neilb@ownmail.net>

On Mon, 2026-07-06 at 08:19 +1000, NeilBrown wrote:
> From: NeilBrown <neil@brown.name>
> 
> All the code in nfsd4_create_file() that is VFS manipulation, with now
> NFS-specific knowledge, has been localised.  Now we split that out into
> a separate function: do_lookup_open().
> 
> It is planned to provide a vfs_lookup_open() in vfs code which provides
> this functionality.  This will share more code with the syscall open
> path, and make it easier to modify locking at the VFS level.
> 
> Signed-off-by: NeilBrown <neil@brown.name>
> ---
>  fs/nfsd/nfs4proc.c | 108 ++++++++++++++++++++++++---------------------
>  1 file changed, 58 insertions(+), 50 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
> index 10323c620b71..643cf4302db5 100644
> --- a/fs/nfsd/nfs4proc.c
> +++ b/fs/nfsd/nfs4proc.c
> @@ -201,6 +201,47 @@ static inline bool nfsd4_create_is_exclusive(int createmode)
>  		createmode == NFS4_CREATE_EXCLUSIVE4_1;
>  }
>  
> +static struct file *do_lookup_open(struct path *parent,
> +				   struct qstr *name,
> +				   unsigned int oflags,
> +				   umode_t mode)
> +{
> +	struct file *filp = NULL;
> +	struct path path;
> +	struct dentry *child;
> +	int error = 0;
> +
> +	error = mnt_want_write(parent->mnt);
> +
> +	if (error)
> +		return ERR_PTR(error);
> +
> +	child = start_creating(&nop_mnt_idmap, parent->dentry, name);
> +	if (IS_ERR(child)) {
> +		filp = ERR_CAST(child);
> +		goto out;
> +	}
> +	path.mnt = parent->mnt;
> +	path.dentry = child;
> +
> +	if (d_really_is_positive(child)) {
> +		/*
> +		 * open the file so that, unless it is O_RDONLY, we
> +		 * have write-access to the fs for setattr below.
> +		 */
> +		filp = dentry_open(&path, oflags, current_cred());
> +	} else if (!(oflags & O_CREAT)) {
> +		filp = ERR_PTR(-ENOENT);
> +	} else {
> +		filp = dentry_create(&path, oflags, mode, current_cred());
> +		child = path.dentry;
> +	}
> +	end_creating(child);
> +out:
> +	mnt_drop_write(parent->mnt);
> +	return filp;
> +}
> +
>  /*
>   * Implement NFSv4's unchecked, guarded, and exclusive create
>   * semantics for regular files. Open state for this new file is
> @@ -218,14 +259,13 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
>  		.na_seclabel	= &open->op_label,
>  	};
>  	int oflags = O_CREAT | O_LARGEFILE;
> -	struct dentry *parent, *child = ERR_PTR(-EINVAL);
> -	struct path path = {
> +	struct dentry *child = ERR_PTR(-EINVAL);
> +	struct path parent = {
>  		.mnt = fhp->fh_export->ex_path.mnt,
> +		.dentry = fhp->fh_dentry,
>  	};
>  	__u32 v_mtime, v_atime;
> -	struct inode *inode;
>  	__be32 status, create_status;
> -	int host_err;
>  
>  	if (name_is_dot_dotdot(open->op_fname, open->op_fnamelen))
>  		return nfserr_exist;
> @@ -235,10 +275,8 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
>  	status = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_EXEC);
>  	if (status != nfs_ok)
>  		return status;
> -	parent = fhp->fh_dentry;
> -	inode = d_inode(parent);
>  
> -	if (!IS_POSIXACL(inode))
> +	if (!IS_POSIXACL(d_inode(parent.dentry)))
>  		iap->ia_mode &= ~current_umask();
>  
>  	/*
> @@ -303,53 +341,23 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,
>  	}
>  
>  	create_status = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_CREATE);
> -
> -	host_err = fh_want_write(fhp);
> -	if (host_err) {
> -		status = nfserrno(host_err);
> -		goto out;
> -	}
> -
> -	child = start_creating(&nop_mnt_idmap, parent,
> -			       &QSTR_LEN(open->op_fname, open->op_fnamelen));
> -	if (IS_ERR(child)) {
> -		status = nfserrno(PTR_ERR(child));
> -		fh_drop_write(fhp);
> +	if (create_status)
> +		oflags &= ~O_CREAT;
> +	open->op_filp = do_lookup_open(&parent,
> +				       &QSTR_LEN(open->op_fname,
> +						 open->op_fnamelen),
> +				       oflags,
> +				       open->op_iattr.ia_mode);
> +	if (IS_ERR(open->op_filp)) {
> +		status = nfserrno(PTR_ERR(open->op_filp));
> +		open->op_filp = NULL;
> +		if (status == NFSERR_NOENT && create_status)
> +			status = create_status;
>  		goto out;
>  	}
> 

My Claude spotted this:

Should this compare against nfserr_noent rather than NFSERR_NOENT?

status is __be32, and it is assigned from nfserrno(-ENOENT), which returns
nfserr_noent.


-- 
Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2026-07-06 16:00 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-05 22:19 [PATCH v2 00/14] nfsd: refactor nfs4_create_file() NeilBrown
2026-07-05 22:19 ` [PATCH v2 01/14] nfsd: honour client-provided attributes for NFS4_CREATE_EXCLUSIVE4_1 NeilBrown
2026-07-06 16:14   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 02/14] nfsd: replace fh_fill_both_attrs() with fh_fill_post_noop() NeilBrown
2026-07-06 16:15   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 03/14] nfsd: move fh_want_write() after preamble in nfsd4_create_file() NeilBrown
2026-07-06 16:15   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 04/14] nfsd: move more nfs-specific code into preamble of nfsd4_create_file() NeilBrown
2026-07-06 16:16   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 05/14] nfsd: remove subtlety from nfsd4_create_file() NeilBrown
2026-07-06 16:16   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 06/14] nfsd: in nfsd4_create_file() let VFS report if file was created NeilBrown
2026-07-06 15:52   ` Jeff Layton
2026-07-06 23:28     ` NeilBrown
2026-07-05 22:19 ` [PATCH v2 07/14] nfsd: nfsd4_create_file(): Move NFSD_MAY_CREATE check earlier NeilBrown
2026-07-06 16:19   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 08/14] nfsd: always open file in nfsd4_create_file() NeilBrown
2026-07-05 22:19 ` [PATCH v2 09/14] nfsd: reduce range of directory lock " NeilBrown
2026-07-06 16:21   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 10/14] nfsd: open-code nfsd4_vfs_create() into nfsd4_create_file() NeilBrown
2026-07-06 16:21   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 11/14] nfsd: move some code out of the d_really_is_negative() branch in nfsd4_create_file() NeilBrown
2026-07-06 16:23   ` Jeff Layton
2026-07-05 22:19 ` [PATCH v2 12/14] nfsd: reduce want-write range " NeilBrown
2026-07-05 22:19 ` [PATCH v2 13/14] nfsd: separate out VFS-specific from from nfsd4_create_file() NeilBrown
2026-07-06 16:00   ` Jeff Layton [this message]
2026-07-06 23:29     ` NeilBrown
2026-07-05 22:19 ` [PATCH v2 14/14] nfsd: use do_lookup_open() for non-creating open requests too NeilBrown
2026-07-06 14:36   ` Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6f9f29157871d413bcef1531653b2d6811d8aa02.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=Dai.Ngo@oracle.com \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neil@brown.name \
    --cc=okorniev@redhat.com \
    --cc=tom@talpey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox