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 928443cd96
,
with the original socket state code.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
This commit is contained in:
@@ -321,6 +321,7 @@ static int ceph_tcp_connect(struct ceph_connection *con)
|
|||||||
|
|
||||||
dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr));
|
dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr));
|
||||||
|
|
||||||
|
con_sock_state_connecting(con);
|
||||||
ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr),
|
ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr),
|
||||||
O_NONBLOCK);
|
O_NONBLOCK);
|
||||||
if (ret == -EINPROGRESS) {
|
if (ret == -EINPROGRESS) {
|
||||||
@@ -336,8 +337,6 @@ static int ceph_tcp_connect(struct ceph_connection *con)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
con->sock = sock;
|
con->sock = sock;
|
||||||
con_sock_state_connecting(con);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user