| From 24ca9a847791fd53d9b217330b15f3c285827a18 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Date: Tue, 22 Nov 2011 14:44:28 +0200 |
| Subject: SUNRPC: Ensure we return EAGAIN in xs_nospace if congestion is cleared |
| |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| |
| commit 24ca9a847791fd53d9b217330b15f3c285827a18 upstream. |
| |
| By returning '0' instead of 'EAGAIN' when the tests in xs_nospace() fail |
| to find evidence of socket congestion, we are making the RPC engine believe |
| that the message was incorrectly sent and so it disconnects the socket |
| instead of just retrying. |
| |
| The bug appears to have been introduced by commit |
| 5e3771ce2d6a69e10fcc870cdf226d121d868491 (SUNRPC: Ensure that xs_nospace |
| return values are propagated). |
| |
| Reported-by: Andrew Cooper <andrew.cooper3@citrix.com> |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Tested-by: Andrew Cooper <andrew.cooper3@citrix.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/sunrpc/xprtsock.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/net/sunrpc/xprtsock.c |
| +++ b/net/sunrpc/xprtsock.c |
| @@ -493,7 +493,7 @@ static int xs_nospace(struct rpc_task *t |
| struct rpc_rqst *req = task->tk_rqstp; |
| struct rpc_xprt *xprt = req->rq_xprt; |
| struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
| - int ret = 0; |
| + int ret = -EAGAIN; |
| |
| dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", |
| task->tk_pid, req->rq_slen - req->rq_bytes_sent, |
| @@ -505,7 +505,6 @@ static int xs_nospace(struct rpc_task *t |
| /* Don't race with disconnect */ |
| if (xprt_connected(xprt)) { |
| if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) { |
| - ret = -EAGAIN; |
| /* |
| * Notify TCP that we're limited by the application |
| * window size |