SUNRPC: Clean up soft task error handling
- Ensure that the task aborts the RPC call only when it has actually timed out. - Ensure that req->rq_majortimeo is initialised correctly. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
76303992b4
commit
da45828e28
|
@ -863,15 +863,11 @@ call_bind_status(struct rpc_task *task)
|
||||||
dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n",
|
dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n",
|
||||||
task->tk_pid);
|
task->tk_pid);
|
||||||
rpc_delay(task, 3*HZ);
|
rpc_delay(task, 3*HZ);
|
||||||
goto retry_bind;
|
goto retry_timeout;
|
||||||
case -ETIMEDOUT:
|
case -ETIMEDOUT:
|
||||||
dprintk("RPC: %4d rpcbind request timed out\n",
|
dprintk("RPC: %4d rpcbind request timed out\n",
|
||||||
task->tk_pid);
|
task->tk_pid);
|
||||||
if (RPC_IS_SOFT(task)) {
|
goto retry_timeout;
|
||||||
status = -EIO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
goto retry_bind;
|
|
||||||
case -EPFNOSUPPORT:
|
case -EPFNOSUPPORT:
|
||||||
dprintk("RPC: %4d remote rpcbind service unavailable\n",
|
dprintk("RPC: %4d remote rpcbind service unavailable\n",
|
||||||
task->tk_pid);
|
task->tk_pid);
|
||||||
|
@ -884,16 +880,13 @@ call_bind_status(struct rpc_task *task)
|
||||||
dprintk("RPC: %4d unrecognized rpcbind error (%d)\n",
|
dprintk("RPC: %4d unrecognized rpcbind error (%d)\n",
|
||||||
task->tk_pid, -task->tk_status);
|
task->tk_pid, -task->tk_status);
|
||||||
status = -EIO;
|
status = -EIO;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rpc_exit(task, status);
|
rpc_exit(task, status);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
retry_bind:
|
retry_timeout:
|
||||||
task->tk_status = 0;
|
task->tk_action = call_timeout;
|
||||||
task->tk_action = call_bind;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -941,14 +934,16 @@ call_connect_status(struct rpc_task *task)
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case -ENOTCONN:
|
case -ENOTCONN:
|
||||||
case -ETIMEDOUT:
|
|
||||||
case -EAGAIN:
|
case -EAGAIN:
|
||||||
task->tk_action = call_bind;
|
task->tk_action = call_bind;
|
||||||
break;
|
if (!RPC_IS_SOFT(task))
|
||||||
default:
|
return;
|
||||||
rpc_exit(task, -EIO);
|
/* if soft mounted, test if we've timed out */
|
||||||
break;
|
case -ETIMEDOUT:
|
||||||
|
task->tk_action = call_timeout;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
rpc_exit(task, -EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1057,7 +1052,6 @@ call_status(struct rpc_task *task)
|
||||||
printk("%s: RPC call returned error %d\n",
|
printk("%s: RPC call returned error %d\n",
|
||||||
clnt->cl_protname, -status);
|
clnt->cl_protname, -status);
|
||||||
rpc_exit(task, status);
|
rpc_exit(task, status);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1125,10 +1119,10 @@ call_decode(struct rpc_task *task)
|
||||||
clnt->cl_stats->rpcretrans++;
|
clnt->cl_stats->rpcretrans++;
|
||||||
goto out_retry;
|
goto out_retry;
|
||||||
}
|
}
|
||||||
printk(KERN_WARNING "%s: too small RPC reply size (%d bytes)\n",
|
dprintk("%s: too small RPC reply size (%d bytes)\n",
|
||||||
clnt->cl_protname, task->tk_status);
|
clnt->cl_protname, task->tk_status);
|
||||||
rpc_exit(task, -EIO);
|
task->tk_action = call_timeout;
|
||||||
return;
|
goto out_retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -585,13 +585,6 @@ static void xprt_connect_status(struct rpc_task *task)
|
||||||
task->tk_pid, -task->tk_status, task->tk_client->cl_server);
|
task->tk_pid, -task->tk_status, task->tk_client->cl_server);
|
||||||
xprt_release_write(xprt, task);
|
xprt_release_write(xprt, task);
|
||||||
task->tk_status = -EIO;
|
task->tk_status = -EIO;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if soft mounted, just cause this RPC to fail */
|
|
||||||
if (RPC_IS_SOFT(task)) {
|
|
||||||
xprt_release_write(xprt, task);
|
|
||||||
task->tk_status = -EIO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -829,6 +822,7 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
|
||||||
req->rq_bufsize = 0;
|
req->rq_bufsize = 0;
|
||||||
req->rq_xid = xprt_alloc_xid(xprt);
|
req->rq_xid = xprt_alloc_xid(xprt);
|
||||||
req->rq_release_snd_buf = NULL;
|
req->rq_release_snd_buf = NULL;
|
||||||
|
xprt_reset_majortimeo(req);
|
||||||
dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
|
dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
|
||||||
req, ntohl(req->rq_xid));
|
req, ntohl(req->rq_xid));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue