diff options
author | Sage Weil <sage@inktank.com> | 2012-06-09 14:19:21 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-26 11:38:25 -0800 |
commit | fccbf066b35a05606cdb96eb574eaf310c422125 (patch) | |
tree | e0c0b8e93f49891c1af5bcc548892a13d204bb06 | |
parent | f4d29a959aa619f3d46e2b685cfb8acac41503db (diff) | |
download | lwn-fccbf066b35a05606cdb96eb574eaf310c422125.tar.gz lwn-fccbf066b35a05606cdb96eb574eaf310c422125.zip |
libceph: transition socket state prior to actual connect
(cherry picked from commit 89a86be0ce20022f6ede8bccec078dbb3d63caaa)
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-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 5ae586813f39..59e418b3597e 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -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)); + con_sock_state_connecting(con); ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr), O_NONBLOCK); if (ret == -EINPROGRESS) { @@ -336,8 +337,6 @@ static int ceph_tcp_connect(struct ceph_connection *con) return ret; } con->sock = sock; - con_sock_state_connecting(con); - return 0; } |