libceph: clear CONNECTING in ceph_con_close()
authorAlex Elder <elder@inktank.com>
Thu, 21 Jun 2012 02:53:53 +0000 (21:53 -0500)
committerSage Weil <sage@inktank.com>
Fri, 6 Jul 2012 04:14:24 +0000 (21:14 -0700)
A connection that is closed will no longer be connecting.  So
clear the CONNECTING state bit in ceph_con_close().  Similarly,
if the socket has been closed we no longer are in connecting
state (a new connect sequence will need to be initiated).

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
net/ceph/messenger.c

index cfcca1f5be67be38fb6a255629cb42ed68b6ef55..beee382d784eadad9904e85d7b9688b8968d9604 100644 (file)
@@ -462,6 +462,7 @@ void ceph_con_close(struct ceph_connection *con)
        dout("con_close %p peer %s\n", con,
             ceph_pr_addr(&con->peer_addr.in_addr));
        clear_bit(NEGOTIATING, &con->state);
+       clear_bit(CONNECTING, &con->state);
        clear_bit(STANDBY, &con->state);  /* avoid connect_seq bump */
        set_bit(CLOSED, &con->state);
 
@@ -2189,7 +2190,7 @@ static void con_work(struct work_struct *work)
        mutex_lock(&con->mutex);
 restart:
        if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
-               if (test_bit(CONNECTING, &con->state))
+               if (test_and_clear_bit(CONNECTING, &con->state))
                        con->error_msg = "connection failed";
                else
                        con->error_msg = "socket closed";