Re: [PATCH 16/18] nfsd: switch nfsd4_create_file() to use vfs_lookup_open()
"Chuck Lever" <[email protected]>
| Newsgroups | gmane.linux.file-systems,gmane.linux.nfs |
|---|---|
| Message-ID | <[email protected]> |
On Sun, May 31, 2026, at 11:38 PM, NeilBrown wrote:
> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
> index 5bd19e5d9e34..61ecd4123817 100644
> --- a/fs/nfsd/nfs4proc.c
> +++ b/fs/nfsd/nfs4proc.c
> @@ -302,33 +302,18 @@ nfsd4_create_file(struct svc_rqst *rqstp, struct
> svc_fh *fhp,
> oflags |= O_RDONLY;
> }
>
> - host_err = fh_want_write(fhp);
This fh_want_write() is removed, but ...
> - if (host_err)
> - return nfserrno(host_err);
> -
> - child = start_creating(&nop_mnt_idmap, parent,
> - &QSTR_LEN(open->op_fname, open->op_fnamelen));
> - if (IS_ERR(child)) {
> - status = nfserrno(PTR_ERR(child));
> - goto out_write;
> - }
> - path.dentry = child;
> -
> - if (d_really_is_negative(child)) {
> - open->op_filp = dentry_create(&path, oflags, open->op_iattr.ia_mode,
> - current_cred());
> - child = path.dentry;
> -
> - if (IS_ERR(open->op_filp)) {
> - end_creating(child);
> - status = nfserrno(PTR_ERR(open->op_filp));
> - open->op_filp = NULL;
> - goto out_write;
> - }
> -
> - open->op_created = open->op_filp->f_mode & FMODE_CREATED;
> + open->op_filp = vfs_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;
> + goto out;
> }
> - end_creating(child);
> + child = open->op_filp->f_path.dentry;
> + open->op_created = open->op_filp->f_mode & FMODE_CREATED;
> fh_drop_write(fhp);
... the "matching" fh_drop_write remains. Harmless since nothing
has set fhp->fh_want_write, but should be cleaned up.
>
> status = fh_compose(resfhp, fhp->fh_export, child, fhp);
--
Chuck Lever