summaryrefslogtreecommitdiff
path: root/fs/nfsd/nfs4xdr.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2020-11-02 15:19:12 -0500
committerChuck Lever <chuck.lever@oracle.com>2020-11-30 14:46:41 -0500
commit523ec6ed6fb80fd1537d748a06bffd060a8b3235 (patch)
tree7ff732508ff5ca440a14e663c761589877e3ca1b /fs/nfsd/nfs4xdr.c
parent547bfeb4cd8d491aabbd656d5a6f410cb4249b4e (diff)
NFSD: Add a helper to decode state_protect4_a
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>
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r--fs/nfsd/nfs4xdr.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 35b2668b572e..08909c7975dc 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -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++);