Commit 10ff8422 authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Add a helper to decode nfs_impl_id4



Refactor for clarity.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 523ec6ed
Loading
Loading
Loading
Loading
+38 −25
Original line number Diff line number Diff line
@@ -1559,46 +1559,59 @@ nfsd4_decode_state_protect4_a(struct nfsd4_compoundargs *argp,
}

static __be32
nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
nfsd4_decode_nfs_impl_id4(struct nfsd4_compoundargs *argp,
			  struct nfsd4_exchange_id *exid)
{
	DECODE_HEAD;
	int dummy;
	__be32 status;
	u32 count;

	status = nfsd4_decode_verifier4(argp, &exid->verifier);
	if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
		return nfserr_bad_xdr;
	switch (count) {
	case 0:
		break;
	case 1:
		/* Note that RFC 8881 places no length limit on
		 * nii_domain, but this implementation permits no
		 * more than NFS4_OPAQUE_LIMIT bytes */
		status = nfsd4_decode_opaque(argp, &exid->nii_domain);
		if (status)
			return status;
	status = nfsd4_decode_opaque(argp, &exid->clname);
		/* Note that RFC 8881 places no length limit on
		 * nii_name, but this implementation permits no
		 * more than NFS4_OPAQUE_LIMIT bytes */
		status = nfsd4_decode_opaque(argp, &exid->nii_name);
		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);
		status = nfsd4_decode_nfstime4(argp, &exid->nii_time);
		if (status)
			return status;
		break;
	default:
		return nfserr_bad_xdr;
	}

	READ_BUF(4);    /* nfs_impl_id4 array length */
	dummy = be32_to_cpup(p++);
	return nfs_ok;
}

	if (dummy > 1)
		goto xdr_error;
static __be32
nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
			 struct nfsd4_exchange_id *exid)
{
	__be32 status;

	if (dummy == 1) {
		status = nfsd4_decode_opaque(argp, &exid->nii_domain);
	status = nfsd4_decode_verifier4(argp, &exid->verifier);
	if (status)
			goto xdr_error;

		/* nii_name */
		status = nfsd4_decode_opaque(argp, &exid->nii_name);
		return status;
	status = nfsd4_decode_opaque(argp, &exid->clname);
	if (status)
			goto xdr_error;

		/* nii_date */
		status = nfsd4_decode_time(argp, &exid->nii_time);
		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)
			goto xdr_error;
	}
	DECODE_TAIL;
		return status;
	return nfsd4_decode_nfs_impl_id4(argp, exid);
}

static __be32