diff --git a/net/rds/ib.c b/net/rds/ib.c index e6ba856710045a08d2f302cc6da11d4879f82600..7eaf887e46f8ef12ffd7d72aeadb7d0e15459851 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c @@ -388,7 +388,7 @@ struct rds_transport rds_ib_transport = { .recv_path = rds_ib_recv_path, .conn_alloc = rds_ib_conn_alloc, .conn_free = rds_ib_conn_free, - .conn_connect = rds_ib_conn_connect, + .conn_path_connect = rds_ib_conn_path_connect, .conn_path_shutdown = rds_ib_conn_path_shutdown, .inc_copy_to_user = rds_ib_inc_copy_to_user, .inc_free = rds_ib_inc_free, diff --git a/net/rds/ib.h b/net/rds/ib.h index 579de7e6369c999dec098446b094bc88e24fb569..046f7508c06b481bab849d73aa89be47f2e9a411 100644 --- a/net/rds/ib.h +++ b/net/rds/ib.h @@ -328,7 +328,7 @@ extern struct list_head ib_nodev_conns; /* ib_cm.c */ int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp); void rds_ib_conn_free(void *arg); -int rds_ib_conn_connect(struct rds_connection *conn); +int rds_ib_conn_path_connect(struct rds_conn_path *cp); void rds_ib_conn_path_shutdown(struct rds_conn_path *cp); void rds_ib_state_change(struct sock *sk); int rds_ib_listen_init(void); diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c index e34ea0b5c16a03d5af1057108287c7161058b4ba..5b2ab95afa072f4970e25bbc856e916fe28187aa 100644 --- a/net/rds/ib_cm.c +++ b/net/rds/ib_cm.c @@ -685,8 +685,9 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id) return ret; } -int rds_ib_conn_connect(struct rds_connection *conn) +int rds_ib_conn_path_connect(struct rds_conn_path *cp) { + struct rds_connection *conn = cp->cp_conn; struct rds_ib_connection *ic = conn->c_transport_data; struct sockaddr_in src, dest; int ret; diff --git a/net/rds/loop.c b/net/rds/loop.c index 20284a4dca91990900cdc9d1667133c857123b42..f2bf78de5688a3ee44862fe158bffee4ca94d91a 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c @@ -150,9 +150,9 @@ static void rds_loop_conn_free(void *arg) kfree(lc); } -static int rds_loop_conn_connect(struct rds_connection *conn) +static int rds_loop_conn_path_connect(struct rds_conn_path *cp) { - rds_connect_complete(conn); + rds_connect_complete(cp->cp_conn); return 0; } @@ -188,7 +188,7 @@ struct rds_transport rds_loop_transport = { .recv_path = rds_loop_recv_path, .conn_alloc = rds_loop_conn_alloc, .conn_free = rds_loop_conn_free, - .conn_connect = rds_loop_conn_connect, + .conn_path_connect = rds_loop_conn_path_connect, .conn_path_shutdown = rds_loop_conn_path_shutdown, .inc_copy_to_user = rds_message_inc_copy_to_user, .inc_free = rds_loop_inc_free, diff --git a/net/rds/rds.h b/net/rds/rds.h index 0faca30113706a0889dbae683af7feebea31b8b4..6ef07bd272275de9b31fd19d2782bd0bbc142d52 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -454,7 +454,7 @@ struct rds_transport { int (*laddr_check)(struct net *net, __be32 addr); int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp); void (*conn_free)(void *data); - int (*conn_connect)(struct rds_connection *conn); + int (*conn_path_connect)(struct rds_conn_path *cp); void (*conn_path_shutdown)(struct rds_conn_path *conn); void (*xmit_path_prepare)(struct rds_conn_path *cp); void (*xmit_path_complete)(struct rds_conn_path *cp); diff --git a/net/rds/tcp.c b/net/rds/tcp.c index 7bc136c66dbeae7f1f0ce3957e65d0fd2ccfefd9..d278432f080b1e332645e5ed623ce1b700355982 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c @@ -362,7 +362,7 @@ struct rds_transport rds_tcp_transport = { .recv_path = rds_tcp_recv_path, .conn_alloc = rds_tcp_conn_alloc, .conn_free = rds_tcp_conn_free, - .conn_connect = rds_tcp_conn_connect, + .conn_path_connect = rds_tcp_conn_path_connect, .conn_path_shutdown = rds_tcp_conn_path_shutdown, .inc_copy_to_user = rds_tcp_inc_copy_to_user, .inc_free = rds_tcp_inc_free, diff --git a/net/rds/tcp.h b/net/rds/tcp.h index 5a5f91abe1deb0dbd4719962716f155a6ddadd9f..1c3160faa96307b321e460b78a87bc693081c6fc 100644 --- a/net/rds/tcp.h +++ b/net/rds/tcp.h @@ -13,7 +13,7 @@ struct rds_tcp_connection { struct list_head t_tcp_node; struct rds_conn_path *t_cpath; /* t_conn_path_lock synchronizes the connection establishment between - * rds_tcp_accept_one and rds_tcp_conn_connect + * rds_tcp_accept_one and rds_tcp_conn_path_connect */ struct mutex t_conn_path_lock; struct socket *t_sock; @@ -60,7 +60,7 @@ extern struct rds_transport rds_tcp_transport; void rds_tcp_accept_work(struct sock *sk); /* tcp_connect.c */ -int rds_tcp_conn_connect(struct rds_connection *conn); +int rds_tcp_conn_path_connect(struct rds_conn_path *cp); void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn); void rds_tcp_state_change(struct sock *sk); diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index 7eddce50e7a363218d5e7a6e4ebb4b3e6615d565..c916715fbe6132ce1e3b9c94db62281c1a72a6ff 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -74,17 +74,17 @@ void rds_tcp_state_change(struct sock *sk) state_change(sk); } -int rds_tcp_conn_connect(struct rds_connection *conn) +int rds_tcp_conn_path_connect(struct rds_conn_path *cp) { struct socket *sock = NULL; struct sockaddr_in src, dest; int ret; - struct rds_tcp_connection *tc = conn->c_transport_data; - struct rds_conn_path *cp = &conn->c_path[0]; + struct rds_connection *conn = cp->cp_conn; + struct rds_tcp_connection *tc = cp->cp_transport_data; mutex_lock(&tc->t_conn_path_lock); - if (rds_conn_up(conn)) { + if (rds_conn_path_up(cp)) { mutex_unlock(&tc->t_conn_path_lock); return 0; } @@ -118,6 +118,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn) ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), O_NONBLOCK); + cp->cp_outgoing = 1; rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); if (ret == -EINPROGRESS) ret = 0; @@ -125,7 +126,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn) rds_tcp_keepalive(sock); sock = NULL; } else { - rds_tcp_restore_callbacks(sock, conn->c_transport_data); + rds_tcp_restore_callbacks(sock, cp->cp_transport_data); } out: diff --git a/net/rds/threads.c b/net/rds/threads.c index f717b69e03f9c7aa754051757142b581bc3dd669..e8f0941f05487f2c3aec3757478c6bfbac5c292b 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -152,8 +152,9 @@ void rds_connect_worker(struct work_struct *work) int ret; clear_bit(RDS_RECONNECT_PENDING, &cp->cp_flags); - if (rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) { - ret = conn->c_trans->conn_connect(conn); + ret = rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING); + if (ret) { + ret = conn->c_trans->conn_path_connect(cp); rdsdebug("conn %p for %pI4 to %pI4 dispatched, ret %d\n", conn, &conn->c_laddr, &conn->c_faddr, ret);