SUNRPC: Ignore queue transmission errors on successful transmission
If a request transmission fails due to write space or slot unavailability errors, but the queued task then gets transmitted before it has time to process the error in call_transmit_status() or call_bc_transmit_status(), we need to suppress the transmission error code to prevent it from leaking out of the RPC layer. Reported-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Tested-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
@@ -2081,7 +2081,7 @@ call_transmit_status(struct rpc_task *task)
|
|||||||
* test first.
|
* test first.
|
||||||
*/
|
*/
|
||||||
if (rpc_task_transmitted(task)) {
|
if (rpc_task_transmitted(task)) {
|
||||||
if (task->tk_status == 0)
|
task->tk_status = 0;
|
||||||
xprt_request_wait_receive(task);
|
xprt_request_wait_receive(task);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2167,6 +2167,9 @@ call_bc_transmit_status(struct rpc_task *task)
|
|||||||
{
|
{
|
||||||
struct rpc_rqst *req = task->tk_rqstp;
|
struct rpc_rqst *req = task->tk_rqstp;
|
||||||
|
|
||||||
|
if (rpc_task_transmitted(task))
|
||||||
|
task->tk_status = 0;
|
||||||
|
|
||||||
dprint_status(task);
|
dprint_status(task);
|
||||||
|
|
||||||
switch (task->tk_status) {
|
switch (task->tk_status) {
|
||||||
|
Reference in New Issue
Block a user