NFSD: Add a helper to decode state_protect4_a
authorChuck Lever <chuck.lever@oracle.com>
Mon, 2 Nov 2020 20:19:12 +0000 (15:19 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 30 Nov 2020 19:46:41 +0000 (14:46 -0500)
Refactor for clarity.

Also, remove a stale comment. Commit ed94164398c9 ("nfsd: implement
machine credential support for some operations") added support for
SP4_MACH_CRED, so state_protect_a is no longer completely ignored.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h

index d7f27ed..be6dcc4 100644 (file)
@@ -3066,7 +3066,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        rpc_ntop(sa, addr_str, sizeof(addr_str));
        dprintk("%s rqstp=%p exid=%p clname.len=%u clname.data=%p "
-               "ip_addr=%s flags %x, spa_how %d\n",
+               "ip_addr=%s flags %x, spa_how %u\n",
                __func__, rqstp, exid, exid->clname.len, exid->clname.data,
                addr_str, exid->flags, exid->spa_how);
 
index 35b2668..08909c7 100644 (file)
@@ -1531,25 +1531,13 @@ nfsd4_decode_ssv_sp_parms(struct nfsd4_compoundargs *argp,
 }
 
 static __be32
-nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
-                        struct nfsd4_exchange_id *exid)
+nfsd4_decode_state_protect4_a(struct nfsd4_compoundargs *argp,
+                             struct nfsd4_exchange_id *exid)
 {
-       DECODE_HEAD;
-       int dummy;
-
-       READ_BUF(NFS4_VERIFIER_SIZE);
-       COPYMEM(exid->verifier.data, NFS4_VERIFIER_SIZE);
+       __be32 status;
 
-       status = nfsd4_decode_opaque(argp, &exid->clname);
-       if (status)
+       if (xdr_stream_decode_u32(argp->xdr, &exid->spa_how) < 0)
                return nfserr_bad_xdr;
-
-       READ_BUF(4);
-       exid->flags = be32_to_cpup(p++);
-
-       /* Ignore state_protect4_a */
-       READ_BUF(4);
-       exid->spa_how = be32_to_cpup(p++);
        switch (exid->spa_how) {
        case SP4_NONE:
                break;
@@ -1564,9 +1552,31 @@ nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
                        return status;
                break;
        default:
-               goto xdr_error;
+               return nfserr_bad_xdr;
        }
 
+       return nfs_ok;
+}
+
+static __be32
+nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
+                        struct nfsd4_exchange_id *exid)
+{
+       DECODE_HEAD;
+       int dummy;
+
+       status = nfsd4_decode_verifier4(argp, &exid->verifier);
+       if (status)
+               return status;
+       status = nfsd4_decode_opaque(argp, &exid->clname);
+       if (status)
+               return status;
+       if (xdr_stream_decode_u32(argp->xdr, &exid->flags) < 0)
+               return nfserr_bad_xdr;
+       status = nfsd4_decode_state_protect4_a(argp, exid);
+       if (status)
+               return status;
+
        READ_BUF(4);    /* nfs_impl_id4 array length */
        dummy = be32_to_cpup(p++);
 
index 6245004..232529b 100644 (file)
@@ -433,7 +433,7 @@ struct nfsd4_exchange_id {
        u32             flags;
        clientid_t      clientid;
        u32             seqid;
-       int             spa_how;
+       u32             spa_how;
        u32             spo_must_enforce[3];
        u32             spo_must_allow[3];
        struct xdr_netobj nii_domain;