]> www.infradead.org Git - users/hch/misc.git/commitdiff
NFSD: Avoid using rqstp->rq_vers in nfsd_set_fh_dentry()
authorChuck Lever <chuck.lever@oracle.com>
Thu, 5 Sep 2024 19:09:40 +0000 (15:09 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 23 Sep 2024 19:03:30 +0000 (15:03 -0400)
Currently, fh_verify() makes some daring assumptions about which
version of file handle the caller wants, based on the things it can
find in the passed-in rqstp. The about-to-be-introduced LOCALIO use
case sometimes has no svc_rqst context, so this logic won't work in
that case.

Instead, examine the passed-in file handle. It's .max_size field
should carry information to allow nfsd_set_fh_dentry() to initialize
the file handle appropriately.

The file handle used by lockd and the one created by write_filehandle
never need any of the version-specific fields (which affect things
like write and getattr requests and pre/post attributes).

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: NeilBrown <neilb@suse.de>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfsd/nfsfh.c

index 4b964a71a504bbf7bde7cdf79c69395896e7cbfa..60c2395d7af70e1c196be415b53025e2a4daa8c6 100644 (file)
@@ -267,20 +267,20 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
        fhp->fh_dentry = dentry;
        fhp->fh_export = exp;
 
-       switch (rqstp->rq_vers) {
-       case 4:
+       switch (fhp->fh_maxsize) {
+       case NFS4_FHSIZE:
                if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOATOMIC_ATTR)
                        fhp->fh_no_atomic_attr = true;
                fhp->fh_64bit_cookies = true;
                break;
-       case 3:
+       case NFS3_FHSIZE:
                if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOWCC)
                        fhp->fh_no_wcc = true;
                fhp->fh_64bit_cookies = true;
                if (exp->ex_flags & NFSEXP_V4ROOT)
                        goto out;
                break;
-       case 2:
+       case NFS_FHSIZE:
                fhp->fh_no_wcc = true;
                if (EX_WGATHER(exp))
                        fhp->fh_use_wgather = true;