NFSv4: Pass the stateid to the exception handler in nfs4_read/write_done_cb

The actual stateid used in the READ or WRITE can represent a delegation,
a lock or a stateid, so it is useful to pass it as an argument to the
exception handler when an expired/revoked response is received from the
server. It also ensures that we don't re-label the state as needing
recovery if that has already occurred.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Tested-by: Oleg Drokin <green@linuxhacker.ru>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Trond Myklebust 2016-09-22 13:39:11 -04:00 committed by Anna Schumaker
parent 26f474432a
commit 9c27869d3f

View file

@ -4525,11 +4525,18 @@ static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_header *hdr)
struct nfs_server *server = NFS_SERVER(hdr->inode);
trace_nfs4_read(hdr, task->tk_status);
if (nfs4_async_handle_error(task, server,
hdr->args.context->state,
NULL) == -EAGAIN) {
rpc_restart_call_prepare(task);
return -EAGAIN;
if (task->tk_status < 0) {
struct nfs4_exception exception = {
.inode = hdr->inode,
.state = hdr->args.context->state,
.stateid = &hdr->args.stateid,
};
task->tk_status = nfs4_async_handle_exception(task,
server, task->tk_status, &exception);
if (exception.retry) {
rpc_restart_call_prepare(task);
return -EAGAIN;
}
}
__nfs4_read_done_cb(hdr);
@ -4598,11 +4605,19 @@ static int nfs4_write_done_cb(struct rpc_task *task,
struct inode *inode = hdr->inode;
trace_nfs4_write(hdr, task->tk_status);
if (nfs4_async_handle_error(task, NFS_SERVER(inode),
hdr->args.context->state,
NULL) == -EAGAIN) {
rpc_restart_call_prepare(task);
return -EAGAIN;
if (task->tk_status < 0) {
struct nfs4_exception exception = {
.inode = hdr->inode,
.state = hdr->args.context->state,
.stateid = &hdr->args.stateid,
};
task->tk_status = nfs4_async_handle_exception(task,
NFS_SERVER(inode), task->tk_status,
&exception);
if (exception.retry) {
rpc_restart_call_prepare(task);
return -EAGAIN;
}
}
if (task->tk_status >= 0) {
renew_lease(NFS_SERVER(inode), hdr->timestamp);