Commit 67aa7444 authored by Olga Kornievskaia's avatar Olga Kornievskaia Committed by Anna Schumaker
Browse files

NFS COPY xdr handle async reply



If server returns async reply, it must include a callback stateid,
wr_callback_id in the write_response4.

Signed-off-by: default avatarOlga Kornievskaia <kolga@netapp.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent cb95deea
Loading
Loading
Loading
Loading
+12 −10
Original line number Original line Diff line number Diff line
@@ -389,21 +389,23 @@ static int decode_write_response(struct xdr_stream *xdr,
				 struct nfs42_write_res *res)
				 struct nfs42_write_res *res)
{
{
	__be32 *p;
	__be32 *p;
	int status, count;


	p = xdr_inline_decode(xdr, 4 + 8 + 4);
	p = xdr_inline_decode(xdr, 4);
	if (unlikely(!p))
	if (unlikely(!p))
		goto out_overflow;
		goto out_overflow;

	count = be32_to_cpup(p);
	/*
	if (count > 1)
	 * We never use asynchronous mode, so warn if a server returns
	 * a stateid.
	 */
	if (unlikely(*p != 0)) {
		pr_err_once("%s: server has set unrequested "
				"asynchronous mode\n", __func__);
		return -EREMOTEIO;
		return -EREMOTEIO;
	else if (count == 1) {
		status = decode_opaque_fixed(xdr, &res->stateid,
				NFS4_STATEID_SIZE);
		if (unlikely(status))
			goto out_overflow;
	}
	}
	p++;
	p = xdr_inline_decode(xdr, 8 + 4);
	if (unlikely(!p))
		goto out_overflow;
	p = xdr_decode_hyper(p, &res->count);
	p = xdr_decode_hyper(p, &res->count);
	res->verifier.committed = be32_to_cpup(p);
	res->verifier.committed = be32_to_cpup(p);
	return decode_verifier(xdr, &res->verifier.verifier);
	return decode_verifier(xdr, &res->verifier.verifier);
+1 −0
Original line number Original line Diff line number Diff line
@@ -1391,6 +1391,7 @@ struct nfs42_copy_args {
};
};


struct nfs42_write_res {
struct nfs42_write_res {
	nfs4_stateid		stateid;
	u64			count;
	u64			count;
	struct nfs_writeverf	verifier;
	struct nfs_writeverf	verifier;
};
};