linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: Chuck Lever <chuck.lever@oracle.com>,
	Miklos Szeredi <miklos@szeredi.hu>,
	 Alexander Viro <viro@zeniv.linux.org.uk>,
	Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
	 Alexander Aring <alex.aring@gmail.com>,
	Trond Myklebust <trondmy@kernel.org>,
	Anna Schumaker <anna@kernel.org>,
	 Steve French <sfrench@samba.org>,
	Paulo Alcantara <pc@manguebit.org>,
	Ronnie Sahlberg	 <ronniesahlberg@gmail.com>,
	Shyam Prasad N <sprasad@microsoft.com>,
	Tom Talpey	 <tom@talpey.com>,
	Bharath SM <bharathsm@microsoft.com>,
	Greg Kroah-Hartman	 <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	 Danilo Krummrich	 <dakr@kernel.org>,
	David Howells <dhowells@redhat.com>,
	Tyler Hicks	 <code@tyhicks.com>, NeilBrown <neil@brown.name>,
	Olga Kornievskaia	 <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>,
	Amir Goldstein	 <amir73il@gmail.com>,
	Namjae Jeon <linkinjeon@kernel.org>,
	Steve French	 <smfrench@gmail.com>,
	Sergey Senozhatsky <senozhatsky@chromium.org>,
	Carlos Maiolino <cem@kernel.org>,
	Kuniyuki Iwashima <kuniyu@google.com>,
	"David S. Miller"	 <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski	 <kuba@kernel.org>,
	Paolo Abeni <pabeni@redhat.com>, Simon Horman	 <horms@kernel.org>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	 linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org,
	 samba-technical@lists.samba.org, netfs@lists.linux.dev,
	ecryptfs@vger.kernel.org, 	linux-unionfs@vger.kernel.org,
	linux-xfs@vger.kernel.org, netdev@vger.kernel.org
Subject: Re: [PATCH v2 09/11] nfsd: allow filecache to hold S_IFDIR files
Date: Sun, 19 Oct 2025 09:41:36 -0400	[thread overview]
Message-ID: <af2105e98a924a31ed76462b4076967735285276.camel@kernel.org> (raw)
In-Reply-To: <21904951-0cac-4a79-9be6-7dbf2f9849b6@oracle.com>

On Sat, 2025-10-18 at 15:33 -0400, Chuck Lever wrote:
> On 10/17/25 7:32 AM, Jeff Layton wrote:
> > The filecache infrastructure will only handle S_IFREG files at the
> > moment. Directory delegations will require adding support for opening
> > S_IFDIR inodes.
> > 
> > Plumb a "type" argument into nfsd_file_do_acquire() and have all of the
> > existing callers set it to S_IFREG. Add a new nfsd_file_acquire_dir()
> > wrapper that nfsd can call to request a nfsd_file that holds a directory
> > open.
> > 
> > For now, there is no need for a fsnotify_mark for directories, as
> > CB_NOTIFY is not yet supported. Change nfsd_file_do_acquire() to avoid
> > allocating one for non-S_IFREG inodes.
> > 
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
> > ---
> >  fs/nfsd/filecache.c | 57 ++++++++++++++++++++++++++++++++++++++++-------------
> >  fs/nfsd/filecache.h |  2 ++
> >  fs/nfsd/vfs.c       |  5 +++--
> >  fs/nfsd/vfs.h       |  2 +-
> >  4 files changed, 49 insertions(+), 17 deletions(-)
> > 
> > diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
> > index a238b6725008a5c2988bd3da874d1f34ee778437..93798575b8075c63f95cd415b6d24df706ada0f6 100644
> > --- a/fs/nfsd/filecache.c
> > +++ b/fs/nfsd/filecache.c
> > @@ -1086,7 +1086,7 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct net *net,
> >  		     struct auth_domain *client,
> >  		     struct svc_fh *fhp,
> >  		     unsigned int may_flags, struct file *file,
> > -		     struct nfsd_file **pnf, bool want_gc)
> > +		     umode_t type, bool want_gc, struct nfsd_file **pnf)
> >  {
> >  	unsigned char need = may_flags & NFSD_FILE_MAY_MASK;
> >  	struct nfsd_file *new, *nf;
> > @@ -1097,13 +1097,13 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct net *net,
> >  	int ret;
> >  
> >  retry:
> > -	if (rqstp) {
> > -		status = fh_verify(rqstp, fhp, S_IFREG,
> > +	if (rqstp)
> > +		status = fh_verify(rqstp, fhp, type,
> >  				   may_flags|NFSD_MAY_OWNER_OVERRIDE);
> > -	} else {
> > -		status = fh_verify_local(net, cred, client, fhp, S_IFREG,
> > +	else
> > +		status = fh_verify_local(net, cred, client, fhp, type,
> >  					 may_flags|NFSD_MAY_OWNER_OVERRIDE);
> > -	}
> > +
> >  	if (status != nfs_ok)
> >  		return status;
> >  	inode = d_inode(fhp->fh_dentry);
> > @@ -1176,15 +1176,18 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct net *net,
> >  
> >  open_file:
> >  	trace_nfsd_file_alloc(nf);
> > -	nf->nf_mark = nfsd_file_mark_find_or_create(inode);
> > -	if (nf->nf_mark) {
> > +
> > +	if (type == S_IFREG)
> > +		nf->nf_mark = nfsd_file_mark_find_or_create(inode);
> > +
> > +	if (type != S_IFREG || nf->nf_mark) {
> >  		if (file) {
> >  			get_file(file);
> >  			nf->nf_file = file;
> >  			status = nfs_ok;
> >  			trace_nfsd_file_opened(nf, status);
> >  		} else {
> > -			ret = nfsd_open_verified(fhp, may_flags, &nf->nf_file);
> > +			ret = nfsd_open_verified(fhp, type, may_flags, &nf->nf_file);
> >  			if (ret == -EOPENSTALE && stale_retry) {
> >  				stale_retry = false;
> >  				nfsd_file_unhash(nf);
> > @@ -1246,7 +1249,7 @@ nfsd_file_acquire_gc(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  		     unsigned int may_flags, struct nfsd_file **pnf)
> >  {
> >  	return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL,
> > -				    fhp, may_flags, NULL, pnf, true);
> > +				    fhp, may_flags, NULL, S_IFREG, true, pnf);
> >  }
> >  
> >  /**
> > @@ -1271,7 +1274,7 @@ nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  		  unsigned int may_flags, struct nfsd_file **pnf)
> >  {
> >  	return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL,
> > -				    fhp, may_flags, NULL, pnf, false);
> > +				    fhp, may_flags, NULL, S_IFREG, false, pnf);
> >  }
> >  
> >  /**
> > @@ -1314,8 +1317,8 @@ nfsd_file_acquire_local(struct net *net, struct svc_cred *cred,
> >  	const struct cred *save_cred = get_current_cred();
> >  	__be32 beres;
> >  
> > -	beres = nfsd_file_do_acquire(NULL, net, cred, client,
> > -				     fhp, may_flags, NULL, pnf, false);
> > +	beres = nfsd_file_do_acquire(NULL, net, cred, client, fhp, may_flags,
> > +				     NULL, S_IFREG, false, pnf);
> >  	put_cred(revert_creds(save_cred));
> >  	return beres;
> >  }
> > @@ -1344,7 +1347,33 @@ nfsd_file_acquire_opened(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  			 struct nfsd_file **pnf)
> >  {
> >  	return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL,
> > -				    fhp, may_flags, file, pnf, false);
> > +				    fhp, may_flags, file, S_IFREG, false, pnf);
> > +}
> > +
> > +/**
> > + * nfsd_file_acquire_dir - Get a struct nfsd_file with an open directory
> > + * @rqstp: the RPC transaction being executed
> > + * @fhp: the NFS filehandle of the file to be opened
> > + * @pnf: OUT: new or found "struct nfsd_file" object
> > + *
> > + * The nfsd_file_object returned by this API is reference-counted
> > + * but not garbage-collected. The object is unhashed after the
> > + * final nfsd_file_put(). This opens directories only, and only
> > + * in O_RDONLY mode.
> > + *
> > + * Return values:
> > + *   %nfs_ok - @pnf points to an nfsd_file with its reference
> > + *   count boosted.
> > + *
> > + * On error, an nfsstat value in network byte order is returned.
> > + */
> > +__be32
> > +nfsd_file_acquire_dir(struct svc_rqst *rqstp, struct svc_fh *fhp,
> > +		      struct nfsd_file **pnf)
> > +{
> > +	return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL, fhp,
> > +				    NFSD_MAY_READ|NFSD_MAY_64BIT_COOKIE,
> > +				    NULL, S_IFDIR, false, pnf);
> >  }
> >  
> >  /*
> > diff --git a/fs/nfsd/filecache.h b/fs/nfsd/filecache.h
> > index e3d6ca2b60308e5e91ba4bb32d935f54527d8bda..b383dbc5b9218d21a29b852572f80fab08de9fa9 100644
> > --- a/fs/nfsd/filecache.h
> > +++ b/fs/nfsd/filecache.h
> > @@ -82,5 +82,7 @@ __be32 nfsd_file_acquire_opened(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  __be32 nfsd_file_acquire_local(struct net *net, struct svc_cred *cred,
> >  			       struct auth_domain *client, struct svc_fh *fhp,
> >  			       unsigned int may_flags, struct nfsd_file **pnf);
> > +__be32 nfsd_file_acquire_dir(struct svc_rqst *rqstp, struct svc_fh *fhp,
> > +		  struct nfsd_file **pnf);
> >  int nfsd_file_cache_stats_show(struct seq_file *m, void *v);
> >  #endif /* _FS_NFSD_FILECACHE_H */
> > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> > index eeb138569eba5df6de361cf6ba29604722e14af9..12c33223b612664dbb3b18b591e97fc708165763 100644
> > --- a/fs/nfsd/vfs.c
> > +++ b/fs/nfsd/vfs.c
> > @@ -959,15 +959,16 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type,
> >  /**
> >   * nfsd_open_verified - Open a regular file for the filecache
> >   * @fhp: NFS filehandle of the file to open
> > + * @type: S_IFMT inode type allowed (0 means any type is allowed)
> >   * @may_flags: internal permission flags
> >   * @filp: OUT: open "struct file *"
> >   *
> >   * Returns zero on success, or a negative errno value.
> >   */
> >  int
> > -nfsd_open_verified(struct svc_fh *fhp, int may_flags, struct file **filp)
> > +nfsd_open_verified(struct svc_fh *fhp, umode_t type, int may_flags, struct file **filp)
> >  {
> > -	return __nfsd_open(fhp, S_IFREG, may_flags, filp);
> > +	return __nfsd_open(fhp, type, may_flags, filp);
> >  }
> >  
> >  /*
> > diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h
> > index fa46f8b5f132079e3a2c45e71ecf9cc43181f6b0..ded2900d423f80d33fb6c8b809bc5d9fc842ebfd 100644
> > --- a/fs/nfsd/vfs.h
> > +++ b/fs/nfsd/vfs.h
> > @@ -114,7 +114,7 @@ __be32		nfsd_setxattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  int 		nfsd_open_break_lease(struct inode *, int);
> >  __be32		nfsd_open(struct svc_rqst *, struct svc_fh *, umode_t,
> >  				int, struct file **);
> > -int		nfsd_open_verified(struct svc_fh *fhp, int may_flags,
> > +int		nfsd_open_verified(struct svc_fh *fhp, umode_t type, int may_flags,
> >  				struct file **filp);
> >  __be32		nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
> >  				struct file *file, loff_t offset,
> > 
> 
> Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
> 
> These can probably go in via Christian's tree. I don't think there
> are going to be conflicts between these and what's in nfsd-testing
> now.

That would work. I think I have at least one more respin of the VFS
bits before we merge anything anyway.
-- 
Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2025-10-19 13:41 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-17 11:31 [PATCH v2 00/11] vfs: recall-only directory delegations for knfsd Jeff Layton
2025-10-17 11:31 ` [PATCH v2 01/11] filelock: push the S_ISREG check down to ->setlease handlers Jeff Layton
2025-10-17 11:31 ` [PATCH v2 02/11] vfs: add try_break_deleg calls for parents to vfs_{link,rename,unlink} Jeff Layton
2025-10-17 11:31 ` [PATCH v2 03/11] vfs: allow mkdir to wait for delegation break on parent Jeff Layton
2025-10-17 11:31 ` [PATCH v2 04/11] vfs: allow rmdir " Jeff Layton
2025-10-17 11:31 ` [PATCH v2 05/11] vfs: break parent dir delegations in open(..., O_CREAT) codepath Jeff Layton
2025-10-17 11:31 ` [PATCH v2 06/11] vfs: make vfs_create break delegations on parent directory Jeff Layton
2025-10-17 11:31 ` [PATCH v2 07/11] vfs: make vfs_mknod " Jeff Layton
2025-10-17 11:32 ` [PATCH v2 08/11] filelock: lift the ban on directory leases in generic_setlease Jeff Layton
2025-10-17 11:32 ` [PATCH v2 09/11] nfsd: allow filecache to hold S_IFDIR files Jeff Layton
2025-10-18 19:33   ` Chuck Lever
2025-10-19 13:41     ` Jeff Layton [this message]
2025-10-17 11:32 ` [PATCH v2 10/11] nfsd: allow DELEGRETURN on directories Jeff Layton
2025-10-18 19:37   ` Chuck Lever
2025-10-17 11:32 ` [PATCH v2 11/11] nfsd: wire up GET_DIR_DELEGATION handling Jeff Layton
2025-10-18 19:46   ` Chuck Lever
2025-10-19 13:46     ` Jeff Layton
2025-10-17 23:44 ` [PATCH v2 00/11] vfs: recall-only directory delegations for knfsd NeilBrown
2025-10-19 14:17   ` Jeff Layton
2025-10-21 13:09 ` Christian Brauner

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=af2105e98a924a31ed76462b4076967735285276.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=Dai.Ngo@oracle.com \
    --cc=alex.aring@gmail.com \
    --cc=amir73il@gmail.com \
    --cc=anna@kernel.org \
    --cc=bharathsm@microsoft.com \
    --cc=brauner@kernel.org \
    --cc=cem@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=code@tyhicks.com \
    --cc=dakr@kernel.org \
    --cc=davem@davemloft.net \
    --cc=dhowells@redhat.com \
    --cc=ecryptfs@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=horms@kernel.org \
    --cc=jack@suse.cz \
    --cc=kuba@kernel.org \
    --cc=kuniyu@google.com \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=neil@brown.name \
    --cc=netdev@vger.kernel.org \
    --cc=netfs@lists.linux.dev \
    --cc=okorniev@redhat.com \
    --cc=pabeni@redhat.com \
    --cc=pc@manguebit.org \
    --cc=rafael@kernel.org \
    --cc=ronniesahlberg@gmail.com \
    --cc=samba-technical@lists.samba.org \
    --cc=senozhatsky@chromium.org \
    --cc=sfrench@samba.org \
    --cc=smfrench@gmail.com \
    --cc=sprasad@microsoft.com \
    --cc=tom@talpey.com \
    --cc=trondmy@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /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;
as well as URLs for NNTP newsgroup(s).