diff options
author | Sage Weil <sage@inktank.com> | 2012-06-09 17:19:21 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-06-15 14:26:37 -0400 |
commit | 89a86be0ce20022f6ede8bccec078dbb3d63caaa (patch) | |
tree | 8f0f125b5f094d647c77eef45b7e33f6d0ab2b15 /net/ceph/messenger.c | |
parent | a5506049500b30dbc5edb4d07a3577477c1f3643 (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.c | 3 |
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 | ||