diff options
Diffstat (limited to 'net/sunrpc/xprt.c')
| -rw-r--r-- | net/sunrpc/xprt.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 86bea4520c4d..ce927002862a 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -826,8 +826,15 @@ void xprt_connect(struct rpc_task *task) | |||
| 826 | return; | 826 | return; |
| 827 | if (xprt_test_and_set_connecting(xprt)) | 827 | if (xprt_test_and_set_connecting(xprt)) |
| 828 | return; | 828 | return; |
| 829 | xprt->stat.connect_start = jiffies; | 829 | /* Race breaker */ |
| 830 | xprt->ops->connect(xprt, task); | 830 | if (!xprt_connected(xprt)) { |
| 831 | xprt->stat.connect_start = jiffies; | ||
| 832 | xprt->ops->connect(xprt, task); | ||
| 833 | } else { | ||
| 834 | xprt_clear_connecting(xprt); | ||
| 835 | task->tk_status = 0; | ||
| 836 | rpc_wake_up_queued_task(&xprt->pending, task); | ||
| 837 | } | ||
| 831 | } | 838 | } |
| 832 | xprt_release_write(xprt, task); | 839 | xprt_release_write(xprt, task); |
| 833 | } | 840 | } |
| @@ -1623,6 +1630,8 @@ xprt_request_init(struct rpc_task *task) | |||
| 1623 | req->rq_snd_buf.buflen = 0; | 1630 | req->rq_snd_buf.buflen = 0; |
| 1624 | req->rq_rcv_buf.len = 0; | 1631 | req->rq_rcv_buf.len = 0; |
| 1625 | req->rq_rcv_buf.buflen = 0; | 1632 | req->rq_rcv_buf.buflen = 0; |
| 1633 | req->rq_snd_buf.bvec = NULL; | ||
| 1634 | req->rq_rcv_buf.bvec = NULL; | ||
| 1626 | req->rq_release_snd_buf = NULL; | 1635 | req->rq_release_snd_buf = NULL; |
| 1627 | xprt_reset_majortimeo(req); | 1636 | xprt_reset_majortimeo(req); |
| 1628 | dprintk("RPC: %5u reserved req %p xid %08x\n", task->tk_pid, | 1637 | dprintk("RPC: %5u reserved req %p xid %08x\n", task->tk_pid, |
