nfsd: move V4ROOT version check to nfsd_set_fh_dentry()

This further centralizes version number checks.

Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
NeilBrown 2024-07-26 12:21:35 +10:00 committed by Chuck Lever
parent c689bdd3bf
commit ef7f6c4904

View file

@ -116,19 +116,11 @@ static __be32 nfsd_setuser_and_check_port(struct svc_rqst *rqstp,
return nfserrno(nfsd_setuser(&rqstp->rq_cred, exp)); return nfserrno(nfsd_setuser(&rqstp->rq_cred, exp));
} }
static inline __be32 check_pseudo_root(struct svc_rqst *rqstp, static inline __be32 check_pseudo_root(struct dentry *dentry,
struct dentry *dentry, struct svc_export *exp) struct svc_export *exp)
{ {
if (!(exp->ex_flags & NFSEXP_V4ROOT)) if (!(exp->ex_flags & NFSEXP_V4ROOT))
return nfs_ok; return nfs_ok;
/*
* v2/v3 clients have no need for the V4ROOT export--they use
* the mount protocl instead; also, further V4ROOT checks may be
* in v4-specific code, in which case v2/v3 clients could bypass
* them.
*/
if (!nfsd_v4client(rqstp))
return nfserr_stale;
/* /*
* We're exposing only the directories and symlinks that have to be * We're exposing only the directories and symlinks that have to be
* traversed on the way to real exports: * traversed on the way to real exports:
@ -290,11 +282,15 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOWCC) if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOWCC)
fhp->fh_no_wcc = true; fhp->fh_no_wcc = true;
fhp->fh_64bit_cookies = true; fhp->fh_64bit_cookies = true;
if (exp->ex_flags & NFSEXP_V4ROOT)
goto out;
break; break;
case 2: case 2:
fhp->fh_no_wcc = true; fhp->fh_no_wcc = true;
if (EX_WGATHER(exp)) if (EX_WGATHER(exp))
fhp->fh_use_wgather = true; fhp->fh_use_wgather = true;
if (exp->ex_flags & NFSEXP_V4ROOT)
goto out;
} }
return 0; return 0;
@ -364,7 +360,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
* (for example, if different id-squashing options are in * (for example, if different id-squashing options are in
* effect on the new filesystem). * effect on the new filesystem).
*/ */
error = check_pseudo_root(rqstp, dentry, exp); error = check_pseudo_root(dentry, exp);
if (error) if (error)
goto out; goto out;