提交 0b9e7943 编写于 作者: T Trond Myklebust

SUNRPC: Move the test for XPRT_CONNECTING into xprt_connect()

This fixes a bug with setting xprt->stat.connect_start.
Reviewed-by: NChuck Lever <chuck.lever@oracle.com>
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 19445b99
...@@ -712,10 +712,14 @@ void xprt_connect(struct rpc_task *task) ...@@ -712,10 +712,14 @@ void xprt_connect(struct rpc_task *task)
task->tk_timeout = xprt->connect_timeout; task->tk_timeout = xprt->connect_timeout;
rpc_sleep_on(&xprt->pending, task, xprt_connect_status); 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->stat.connect_start = jiffies;
xprt->ops->connect(task); xprt->ops->connect(task);
} }
return;
} }
static void xprt_connect_status(struct rpc_task *task) static void xprt_connect_status(struct rpc_task *task)
......
...@@ -449,21 +449,19 @@ xprt_rdma_connect(struct rpc_task *task) ...@@ -449,21 +449,19 @@ xprt_rdma_connect(struct rpc_task *task)
struct rpc_xprt *xprt = (struct rpc_xprt *)task->tk_xprt; struct rpc_xprt *xprt = (struct rpc_xprt *)task->tk_xprt;
struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(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) {
if (r_xprt->rx_ep.rep_connected != 0) { /* Reconnect */
/* Reconnect */ schedule_delayed_work(&r_xprt->rdma_connect,
schedule_delayed_work(&r_xprt->rdma_connect, xprt->reestablish_timeout);
xprt->reestablish_timeout); xprt->reestablish_timeout <<= 1;
xprt->reestablish_timeout <<= 1; if (xprt->reestablish_timeout > (30 * HZ))
if (xprt->reestablish_timeout > (30 * HZ)) xprt->reestablish_timeout = (30 * HZ);
xprt->reestablish_timeout = (30 * HZ); else if (xprt->reestablish_timeout < (5 * HZ))
else if (xprt->reestablish_timeout < (5 * HZ)) xprt->reestablish_timeout = (5 * HZ);
xprt->reestablish_timeout = (5 * HZ); } else {
} else { schedule_delayed_work(&r_xprt->rdma_connect, 0);
schedule_delayed_work(&r_xprt->rdma_connect, 0); if (!RPC_IS_ASYNC(task))
if (!RPC_IS_ASYNC(task)) flush_scheduled_work();
flush_scheduled_work();
}
} }
} }
......
...@@ -2016,9 +2016,6 @@ static void xs_connect(struct rpc_task *task) ...@@ -2016,9 +2016,6 @@ static void xs_connect(struct rpc_task *task)
struct rpc_xprt *xprt = task->tk_xprt; struct rpc_xprt *xprt = task->tk_xprt;
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, 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)) { if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {
dprintk("RPC: xs_connect delayed xprt %p for %lu " dprintk("RPC: xs_connect delayed xprt %p for %lu "
"seconds\n", "seconds\n",
...@@ -2038,16 +2035,6 @@ static void xs_connect(struct rpc_task *task) ...@@ -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 * xs_udp_print_stats - display UDP socket-specifc stats
* @xprt: rpc_xprt struct containing statistics * @xprt: rpc_xprt struct containing statistics
...@@ -2246,7 +2233,7 @@ static struct rpc_xprt_ops xs_tcp_ops = { ...@@ -2246,7 +2233,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
.release_xprt = xs_tcp_release_xprt, .release_xprt = xs_tcp_release_xprt,
.rpcbind = rpcb_getport_async, .rpcbind = rpcb_getport_async,
.set_port = xs_set_port, .set_port = xs_set_port,
.connect = xs_tcp_connect, .connect = xs_connect,
.buf_alloc = rpc_malloc, .buf_alloc = rpc_malloc,
.buf_free = rpc_free, .buf_free = rpc_free,
.send_request = xs_tcp_send_request, .send_request = xs_tcp_send_request,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册