Commit 5c41f321 authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Handle an NFS4ERR_DELAY response to CB_OFFLOAD



RFC 7862 permits callback services to respond to CB_OFFLOAD with
NFS4ERR_DELAY. Currently NFSD drops the CB_OFFLOAD in that case.

To improve the reliability of COPY offload, NFSD should rather send
another CB_OFFLOAD completion notification.

Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 409d6f52
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1617,6 +1617,13 @@ static int nfsd4_cb_offload_done(struct nfsd4_callback *cb,
		container_of(cb, struct nfsd4_cb_offload, co_cb);

	trace_nfsd_cb_offload_done(&cbo->co_res.cb_stateid, task);
	switch (task->tk_status) {
	case -NFS4ERR_DELAY:
		if (cbo->co_retries--) {
			rpc_delay(task, 1 * HZ);
			return 0;
		}
	}
	return 1;
}

@@ -1745,6 +1752,7 @@ static void nfsd4_send_cb_offload(struct nfsd4_copy *copy)
	memcpy(&cbo->co_res, &copy->cp_res, sizeof(copy->cp_res));
	memcpy(&cbo->co_fh, &copy->fh, sizeof(copy->fh));
	cbo->co_nfserr = copy->nfserr;
	cbo->co_retries = 5;

	nfsd4_init_cb(&cbo->co_cb, copy->cp_clp, &nfsd4_cb_offload_ops,
		      NFSPROC4_CLNT_CB_OFFLOAD);
+1 −0
Original line number Diff line number Diff line
@@ -676,6 +676,7 @@ struct nfsd4_cb_offload {
	struct nfsd4_callback	co_cb;
	struct nfsd42_write_res	co_res;
	__be32			co_nfserr;
	unsigned int		co_retries;
	struct knfsd_fh		co_fh;
};