X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=net%2Frds%2Ftcp_connect.c;h=49a3fcfed360edfb146416976c700b24e4520864;hb=c5e0666c5a3ccabdf16bb88451886cdf81849b66;hp=5cb16875c4603dba71c733de6600ada40e39cffc;hpb=9786cff38a31c452e32fd2f9a479dd7d19d91712;p=deliverable%2Flinux.git 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;