From: NeilBrown <neilb@suse.de>
To: Chuck Lever <chuck.lever@oracle.com>, Jeff Layton <jlayton@kernel.org>
Cc: linux-nfs@vger.kernel.org, Olga Kornievskaia <kolga@netapp.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>,
Mike Snitzer <snitzer@kernel.org>
Subject: [PATCH 3/6] nfsd: pass nfs_vers explicitly to __fh_verify()
Date: Mon, 1 Jul 2024 12:53:18 +1000 [thread overview]
Message-ID: <20240701025802.22985-4-neilb@suse.de> (raw)
In-Reply-To: <20240701025802.22985-1-neilb@suse.de>
Rather then depending on rqstp->rq_vers to determine nfs version, pass
it in explicitly. This removes another dependency on rqstp and ensures
the correct version is checked. The rqstp can be for an NLM request and
while some code tests that, other code does not.
Signed-off-by: NeilBrown <neilb@suse.de>
---
fs/nfsd/nfsfh.c | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
index 760684fa4b50..adc731bb171e 100644
--- a/fs/nfsd/nfsfh.c
+++ b/fs/nfsd/nfsfh.c
@@ -62,7 +62,7 @@ static int nfsd_acceptable(void *expv, struct dentry *dentry)
* the write call).
*/
static inline __be32
-nfsd_mode_check(struct svc_rqst *rqstp, struct dentry *dentry,
+nfsd_mode_check(int nfs_vers, struct dentry *dentry,
umode_t requested)
{
umode_t mode = d_inode(dentry)->i_mode & S_IFMT;
@@ -80,7 +80,7 @@ nfsd_mode_check(struct svc_rqst *rqstp, struct dentry *dentry,
* v4 has an error more specific than err_notdir which we should
* return in preference to err_notdir:
*/
- if (rqstp->rq_vers == 4 && mode == S_IFLNK)
+ if (nfs_vers == 4 && mode == S_IFLNK)
return nfserr_symlink;
if (requested == S_IFDIR)
return nfserr_notdir;
@@ -117,8 +117,9 @@ static __be32 nfsd_setuser_and_check_port(struct svc_rqst *rqstp,
return nfserrno(nfsd_setuser(cred, exp));
}
-static inline __be32 check_pseudo_root(struct svc_rqst *rqstp,
- struct dentry *dentry, struct svc_export *exp)
+static inline __be32 check_pseudo_root(int nfs_vers,
+ struct dentry *dentry,
+ struct svc_export *exp)
{
if (!(exp->ex_flags & NFSEXP_V4ROOT))
return nfs_ok;
@@ -128,7 +129,7 @@ static inline __be32 check_pseudo_root(struct svc_rqst *rqstp,
* in v4-specific code, in which case v2/v3 clients could bypass
* them.
*/
- if (!nfsd_v4client(rqstp))
+ if (nfs_vers != 4)
return nfserr_stale;
/*
* We're exposing only the directories and symlinks that have to be
@@ -153,7 +154,7 @@ static inline __be32 check_pseudo_root(struct svc_rqst *rqstp,
* fh_dentry.
*/
static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct nfsd_net *nn,
- struct svc_cred *cred,
+ struct svc_cred *cred, int nfs_vers,
struct svc_fh *fhp)
{
struct knfsd_fh *fh = &fhp->fh_handle;
@@ -166,9 +167,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct nfsd_net *nn,
__be32 error;
error = nfserr_stale;
- if (rqstp->rq_vers > 2)
+ if (nfs_vers > 2)
error = nfserr_badhandle;
- if (rqstp->rq_vers == 4 && fh->fh_size == 0)
+ if (nfs_vers == 4 && fh->fh_size == 0)
return nfserr_nofilehandle;
if (fh->fh_version != 1)
@@ -241,7 +242,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct nfsd_net *nn,
* Look up the dentry using the NFS file handle.
*/
error = nfserr_stale;
- if (rqstp->rq_vers > 2)
+ if (nfs_vers > 2)
error = nfserr_badhandle;
fileid_type = fh->fh_fileid_type;
@@ -281,7 +282,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct nfsd_net *nn,
fhp->fh_dentry = dentry;
fhp->fh_export = exp;
- switch (rqstp->rq_vers) {
+ switch (nfs_vers) {
case 4:
if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOATOMIC_ATTR)
fhp->fh_no_atomic_attr = true;
@@ -330,6 +331,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct nfsd_net *nn,
static __be32
__fh_verify(struct svc_rqst *rqstp,
struct nfsd_net *nn, struct svc_cred *cred,
+ int nfs_vers,
struct svc_fh *fhp, umode_t type, int access)
{
struct svc_export *exp = NULL;
@@ -337,7 +339,7 @@ __fh_verify(struct svc_rqst *rqstp,
__be32 error;
if (!fhp->fh_dentry) {
- error = nfsd_set_fh_dentry(rqstp, nn, cred, fhp);
+ error = nfsd_set_fh_dentry(rqstp, nn, cred, nfs_vers, fhp);
if (error)
goto out;
}
@@ -362,7 +364,7 @@ __fh_verify(struct svc_rqst *rqstp,
* (for example, if different id-squashing options are in
* effect on the new filesystem).
*/
- error = check_pseudo_root(rqstp, dentry, exp);
+ error = check_pseudo_root(nfs_vers, dentry, exp);
if (error)
goto out;
@@ -370,7 +372,7 @@ __fh_verify(struct svc_rqst *rqstp,
if (error)
goto out;
- error = nfsd_mode_check(rqstp, dentry, type);
+ error = nfsd_mode_check(nfs_vers, dentry, type);
if (error)
goto out;
@@ -407,12 +409,16 @@ __fh_verify(struct svc_rqst *rqstp,
__be32
fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
{
+ int nfs_vers;
+ if (rqstp->rq_prog == NFS_PROGRAM)
+ nfs_vers = rqstp->rq_vers;
+ else /* must be NLM */
+ nfs_vers = rqstp->rq_vers == 4 ? 3 : 2;
return __fh_verify(rqstp, net_generic(SVC_NET(rqstp), nfsd_net_id),
- &rqstp->rq_cred,
+ &rqstp->rq_cred, nfs_vers,
fhp, type, access);
}
-
/*
* Compose a file handle for an NFS reply.
*
--
2.44.0
next prev parent reply other threads:[~2024-07-01 2:58 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 2:53 [PATCH 0/6 RFC] nfsd: provide simpler interface for LOCALIO access NeilBrown
2024-07-01 2:53 ` [PATCH 1/6] nfsd: introduce __fh_verify which takes explicit nfsd_net arg NeilBrown
2024-07-01 14:54 ` Chuck Lever
2024-07-01 15:46 ` kernel test robot
2024-07-01 2:53 ` [PATCH 2/6] nfsd: add cred parameter to __fh_verify() NeilBrown
2024-07-01 11:02 ` Jeff Layton
2024-07-01 17:34 ` kernel test robot
2024-07-01 2:53 ` NeilBrown [this message]
2024-07-01 14:57 ` [PATCH 3/6] nfsd: pass nfs_vers explicitly " Chuck Lever
2024-07-01 19:16 ` kernel test robot
2024-07-01 2:53 ` [PATCH 4/6] nfsd: pass client " NeilBrown
2024-07-01 11:12 ` Jeff Layton
2024-07-01 2:53 ` [PATCH 5/6] nfsd: __fh_verify now treats NULL rqstp as a trusted connection NeilBrown
2024-07-01 2:53 ` [PATCH 6/6] nfsd: add nfsd_file_acquire_local() NeilBrown
2024-07-01 11:21 ` Jeff Layton
2024-07-01 23:55 ` NeilBrown
2024-07-02 0:29 ` Jeff Layton
2024-07-04 8:58 ` kernel test robot
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=20240701025802.22985-4-neilb@suse.de \
--to=neilb@suse.de \
--cc=Dai.Ngo@oracle.com \
--cc=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=kolga@netapp.com \
--cc=linux-nfs@vger.kernel.org \
--cc=snitzer@kernel.org \
--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