aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph/messenger.c
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-06-09 17:19:21 -0400
committerSage Weil <sage@inktank.com>2012-06-15 14:26:37 -0400
commit89a86be0ce20022f6ede8bccec078dbb3d63caaa (patch)
tree8f0f125b5f094d647c77eef45b7e33f6d0ab2b15 /net/ceph/messenger.c
parenta5506049500b30dbc5edb4d07a3577477c1f3643 (diff)
libceph: transition socket state prior to actual connect
Once we call ->connect(), we are racing against the actual connection, and a subsequent transition from CONNECTING -> CONNECTED. Set the state to CONNECTING before that, under the protection of the mutex, to avoid the race. This was introduced in 928443cd9644e7cfd46f687dbeffda2d1a357ff9, with the original socket state code. Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Alex Elder <elder@inktank.com>
Diffstat (limited to 'net/ceph/messenger.c')
-rw-r--r--net/ceph/messenger.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 769a2c9fe1af..bdbecac2d69d 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -321,6 +321,7 @@ static int ceph_tcp_connect(struct ceph_connection *con)
321 321
322 dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr)); 322 dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr));
323 323
324 con_sock_state_connecting(con);
324 ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr), 325 ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr),
325 O_NONBLOCK); 326 O_NONBLOCK);
326 if (ret == -EINPROGRESS) { 327 if (ret == -EINPROGRESS) {
@@ -336,8 +337,6 @@ static int ceph_tcp_connect(struct ceph_connection *con)
336 return ret; 337 return ret;
337 } 338 }
338 con->sock = sock; 339 con->sock = sock;
339 con_sock_state_connecting(con);
340
341 return 0; 340 return 0;
342} 341}
343 342