SUNRPC: Move the test for XPRT_CONNECTING into xprt_connect()
Trond Myklebust [Fri, 16 Apr 2010 20:41:57 +0000 (16:41 -0400)]
This fixes a bug with setting xprt->stat.connect_start.

Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

net/sunrpc/xprt.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtsock.c

index 18415cc..c71d835 100644 (file)
@@ -712,10 +712,14 @@ void xprt_connect(struct rpc_task *task)
 
                task->tk_timeout = xprt->connect_timeout;
                rpc_sleep_on(&xprt->pending, task, xprt_connect_status);
+
+               if (test_bit(XPRT_CLOSING, &xprt->state))
+                       return;
+               if (xprt_test_and_set_connecting(xprt))
+                       return;
                xprt->stat.connect_start = jiffies;
                xprt->ops->connect(task);
        }
-       return;
 }
 
 static void xprt_connect_status(struct rpc_task *task)
index 187257b..0607b9a 100644 (file)
@@ -449,21 +449,19 @@ xprt_rdma_connect(struct rpc_task *task)
        struct rpc_xprt *xprt = (struct rpc_xprt *)task->tk_xprt;
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
 
-       if (!xprt_test_and_set_connecting(xprt)) {
-               if (r_xprt->rx_ep.rep_connected != 0) {
-                       /* Reconnect */
-                       schedule_delayed_work(&r_xprt->rdma_connect,
-                               xprt->reestablish_timeout);
-                       xprt->reestablish_timeout <<= 1;
-                       if (xprt->reestablish_timeout > (30 * HZ))
-                               xprt->reestablish_timeout = (30 * HZ);
-                       else if (xprt->reestablish_timeout < (5 * HZ))
-                               xprt->reestablish_timeout = (5 * HZ);
-               } else {
-                       schedule_delayed_work(&r_xprt->rdma_connect, 0);
-                       if (!RPC_IS_ASYNC(task))
-                               flush_scheduled_work();
-               }
+       if (r_xprt->rx_ep.rep_connected != 0) {
+               /* Reconnect */
+               schedule_delayed_work(&r_xprt->rdma_connect,
+                       xprt->reestablish_timeout);
+               xprt->reestablish_timeout <<= 1;
+               if (xprt->reestablish_timeout > (30 * HZ))
+                       xprt->reestablish_timeout = (30 * HZ);
+               else if (xprt->reestablish_timeout < (5 * HZ))
+                       xprt->reestablish_timeout = (5 * HZ);
+       } else {
+               schedule_delayed_work(&r_xprt->rdma_connect, 0);
+               if (!RPC_IS_ASYNC(task))
+                       flush_scheduled_work();
        }
 }
 
index 9847c30..d138afa 100644 (file)
@@ -2016,9 +2016,6 @@ static void xs_connect(struct rpc_task *task)
        struct rpc_xprt *xprt = task->tk_xprt;
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
 
-       if (xprt_test_and_set_connecting(xprt))
-               return;
-
        if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {
                dprintk("RPC:       xs_connect delayed xprt %p for %lu "
                                "seconds\n",
@@ -2038,16 +2035,6 @@ static void xs_connect(struct rpc_task *task)
        }
 }
 
-static void xs_tcp_connect(struct rpc_task *task)
-{
-       struct rpc_xprt *xprt = task->tk_xprt;
-
-       /* Exit if we need to wait for socket shutdown to complete */
-       if (test_bit(XPRT_CLOSING, &xprt->state))
-               return;
-       xs_connect(task);
-}
-
 /**
  * xs_udp_print_stats - display UDP socket-specifc stats
  * @xprt: rpc_xprt struct containing statistics
@@ -2246,7 +2233,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
        .release_xprt           = xs_tcp_release_xprt,
        .rpcbind                = rpcb_getport_async,
        .set_port               = xs_set_port,
-       .connect                = xs_tcp_connect,
+       .connect                = xs_connect,
        .buf_alloc              = rpc_malloc,
        .buf_free               = rpc_free,
        .send_request           = xs_tcp_send_request,