diff options
Diffstat (limited to 'net/rds/tcp_connect.c')
| -rw-r--r-- | net/rds/tcp_connect.c | 8 | 
1 files changed, 8 insertions, 0 deletions
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index 5cb16875c460..49a3fcfed360 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -78,7 +78,14 @@ int rds_tcp_conn_connect(struct rds_connection *conn)  	struct socket *sock = NULL;  	struct sockaddr_in src, dest;  	int ret; +	struct rds_tcp_connection *tc = conn->c_transport_data; + +	mutex_lock(&tc->t_conn_lock); +	if (rds_conn_up(conn)) { +		mutex_unlock(&tc->t_conn_lock); +		return 0; +	}  	ret = sock_create_kern(rds_conn_net(conn), PF_INET,  			       SOCK_STREAM, IPPROTO_TCP, &sock);  	if (ret < 0) @@ -120,6 +127,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)  	}  out: +	mutex_unlock(&tc->t_conn_lock);  	if (sock)  		sock_release(sock);  	return ret;  | 
