forked from Minki/linux
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:
parent
26f474432a
commit
9c27869d3f
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user