|
@@ -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);
|