mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
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: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
409d6f52bd
commit
5c41f32147
@ -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, ©->cp_res, sizeof(copy->cp_res));
|
||||
memcpy(&cbo->co_fh, ©->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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user