On Sat, Jun 29, 2024 at 06:18:42PM -0400, Chuck Lever wrote: > > + > > + /* nfs_fh -> svc_fh */ > > + if (nfs_fh->size > NFS4_FHSIZE) { > > + status = -EINVAL; > > + goto out; > > + } > > + fh_init(&fh, NFS4_FHSIZE); > > + fh.fh_handle.fh_size = nfs_fh->size; > > + memcpy(fh.fh_handle.fh_raw, nfs_fh->data, nfs_fh->size); > > + > > + if (fmode & FMODE_READ) > > + mayflags |= NFSD_MAY_READ; > > + if (fmode & FMODE_WRITE) > > + mayflags |= NFSD_MAY_WRITE; > > + > > + beres = nfsd_file_acquire(rqstp, &fh, mayflags, &nf); > > + if (beres) { > > + status = nfs_stat_to_errno(be32_to_cpu(beres)); > > + goto out_fh_put; > > + } > > So I'm wondering whether just calling fh_verify() and then > nfsd_open_verified() would be simpler and/or good enough here. Is > there a strong reason to use the file cache for locally opened > files? Jeff, any thoughts? > Will there be writeback ramifications for > doing this? Maybe we need a comment here explaining how these files > are garbage collected (just an fput by the local I/O client, I would > guess). OK, going back to this: Since right here we immediately call nfsd_file_put(nf); There are no writeback ramifications nor any need to comment about garbage collection. But this still seems like a lot of (possibly unnecessary) overhead for simply obtaining a struct file. > > + > > + *pfilp = get_file(nf->nf_file); > > + > > + nfsd_file_put(nf); > > +out_fh_put: > > + fh_put(&fh); > > + > > +out: > > + nfsd_local_fakerqst_destroy(rqstp); > > +out_revertcred: > > + revert_creds(save_cred); > > + return status; > > +} > > +EXPORT_SYMBOL_GPL(nfsd_open_local_fh); -- Chuck Lever