libceph: clear NEGOTIATING when done
authorAlex Elder <elder@inktank.com>
Wed, 23 May 2012 19:35:23 +0000 (14:35 -0500)
committerSage Weil <sage@inktank.com>
Fri, 6 Jul 2012 04:14:26 +0000 (21:14 -0700)
A connection state's NEGOTIATING bit gets set while in CONNECTING
state after we have successfully exchanged a ceph banner and IP
addresses with the connection's peer (the server).  But that bit
is not cleared again--at least not until another connection attempt
is initiated.

Instead, clear it as soon as the connection is fully established.
Also, clear it when a socket connection gets prematurely closed
in the midst of establishing a ceph connection (in case we had
reached the point where it was set).

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

index beee382d784eadad9904e85d7b9688b8968d9604..500207bad5d6317923fee86c7bfbb5e3744ee40e 100644 (file)
@@ -1562,6 +1562,7 @@ static int process_connect(struct ceph_connection *con)
                        fail_protocol(con);
                        return -1;
                }
+               clear_bit(NEGOTIATING, &con->state);
                clear_bit(CONNECTING, &con->state);
                con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
                con->connect_seq++;
@@ -1951,7 +1952,6 @@ more:
 
        /* open the socket first? */
        if (con->sock == NULL) {
-               clear_bit(NEGOTIATING, &con->state);
                set_bit(CONNECTING, &con->state);
 
                con_out_kvec_reset(con);
@@ -2190,10 +2190,12 @@ static void con_work(struct work_struct *work)
        mutex_lock(&con->mutex);
 restart:
        if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
-               if (test_and_clear_bit(CONNECTING, &con->state))
+               if (test_and_clear_bit(CONNECTING, &con->state)) {
+                       clear_bit(NEGOTIATING, &con->state);
                        con->error_msg = "connection failed";
-               else
+               } else {
                        con->error_msg = "socket closed";
+               }
                goto fault;
        }