|
@@ -128,10 +128,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
|
|
|
struct rds_transport *loop_trans;
|
|
|
unsigned long flags;
|
|
|
int ret;
|
|
|
- struct rds_transport *otrans = trans;
|
|
|
|
|
|
- if (!is_outgoing && otrans->t_type == RDS_TRANS_TCP)
|
|
|
- goto new_conn;
|
|
|
rcu_read_lock();
|
|
|
conn = rds_conn_lookup(net, head, laddr, faddr, trans);
|
|
|
if (conn && conn->c_loopback && conn->c_trans != &rds_loop_transport &&
|
|
@@ -147,7 +144,6 @@ static struct rds_connection *__rds_conn_create(struct net *net,
|
|
|
if (conn)
|
|
|
goto out;
|
|
|
|
|
|
-new_conn:
|
|
|
conn = kmem_cache_zalloc(rds_conn_slab, gfp);
|
|
|
if (!conn) {
|
|
|
conn = ERR_PTR(-ENOMEM);
|
|
@@ -207,6 +203,7 @@ new_conn:
|
|
|
|
|
|
atomic_set(&conn->c_state, RDS_CONN_DOWN);
|
|
|
conn->c_send_gen = 0;
|
|
|
+ conn->c_outgoing = (is_outgoing ? 1 : 0);
|
|
|
conn->c_reconnect_jiffies = 0;
|
|
|
INIT_DELAYED_WORK(&conn->c_send_w, rds_send_worker);
|
|
|
INIT_DELAYED_WORK(&conn->c_recv_w, rds_recv_worker);
|
|
@@ -243,22 +240,13 @@ new_conn:
|
|
|
/* Creating normal conn */
|
|
|
struct rds_connection *found;
|
|
|
|
|
|
- if (!is_outgoing && otrans->t_type == RDS_TRANS_TCP)
|
|
|
- found = NULL;
|
|
|
- else
|
|
|
- found = rds_conn_lookup(net, head, laddr, faddr, trans);
|
|
|
+ found = rds_conn_lookup(net, head, laddr, faddr, trans);
|
|
|
if (found) {
|
|
|
trans->conn_free(conn->c_transport_data);
|
|
|
kmem_cache_free(rds_conn_slab, conn);
|
|
|
conn = found;
|
|
|
} else {
|
|
|
- if ((is_outgoing && otrans->t_type == RDS_TRANS_TCP) ||
|
|
|
- (otrans->t_type != RDS_TRANS_TCP)) {
|
|
|
- /* Only the active side should be added to
|
|
|
- * reconnect list for TCP.
|
|
|
- */
|
|
|
- hlist_add_head_rcu(&conn->c_hash_node, head);
|
|
|
- }
|
|
|
+ hlist_add_head_rcu(&conn->c_hash_node, head);
|
|
|
rds_cong_add_conn(conn);
|
|
|
rds_conn_count++;
|
|
|
}
|
|
@@ -337,7 +325,9 @@ void rds_conn_shutdown(struct rds_connection *conn)
|
|
|
rcu_read_lock();
|
|
|
if (!hlist_unhashed(&conn->c_hash_node)) {
|
|
|
rcu_read_unlock();
|
|
|
- rds_queue_reconnect(conn);
|
|
|
+ if (conn->c_trans->t_type != RDS_TRANS_TCP ||
|
|
|
+ conn->c_outgoing == 1)
|
|
|
+ rds_queue_reconnect(conn);
|
|
|
} else {
|
|
|
rcu_read_unlock();
|
|
|
}
|