return -1;
                }
                clear_bit(NEGOTIATING, &con->state);
-               clear_bit(CONNECTING, &con->state);
                set_bit(CONNECTED, &con->state);
                con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
                con->connect_seq++;
        }
 
 do_next:
-       if (!test_bit(CONNECTING, &con->state)) {
+       if (!test_bit(CONNECTING, &con->state) &&
+                       !test_bit(NEGOTIATING, &con->state)) {
                /* is anything else pending? */
                if (!list_empty(&con->out_queue)) {
                        prepare_write_message(con);
        }
 
        if (test_bit(CONNECTING, &con->state)) {
-               if (!test_bit(NEGOTIATING, &con->state)) {
-                       dout("try_read connecting\n");
-                       ret = read_partial_banner(con);
-                       if (ret <= 0)
-                               goto out;
-                       ret = process_banner(con);
-                       if (ret < 0)
-                               goto out;
-
-                       /* Banner is good, exchange connection info */
-                       ret = prepare_write_connect(con);
-                       if (ret < 0)
-                               goto out;
-                       prepare_read_connect(con);
-                       set_bit(NEGOTIATING, &con->state);
-
-                       /* Send connection info before awaiting response */
+               dout("try_read connecting\n");
+               ret = read_partial_banner(con);
+               if (ret <= 0)
                        goto out;
-               }
+               ret = process_banner(con);
+               if (ret < 0)
+                       goto out;
+
+               clear_bit(CONNECTING, &con->state);
+               set_bit(NEGOTIATING, &con->state);
+
+               /* Banner is good, exchange connection info */
+               ret = prepare_write_connect(con);
+               if (ret < 0)
+                       goto out;
+               prepare_read_connect(con);
+
+               /* Send connection info before awaiting response */
+               goto out;
+       }
+
+       if (test_bit(NEGOTIATING, &con->state)) {
+               dout("try_read negotiating\n");
                ret = read_partial_connect(con);
                if (ret <= 0)
                        goto out;
        if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
                if (test_and_clear_bit(CONNECTED, &con->state))
                        con->error_msg = "socket closed";
-               else if (test_and_clear_bit(CONNECTING, &con->state)) {
-                       clear_bit(NEGOTIATING, &con->state);
+               else if (test_and_clear_bit(NEGOTIATING, &con->state))
+                       con->error_msg = "negotiation failed";
+               else if (test_and_clear_bit(CONNECTING, &con->state))
                        con->error_msg = "connection failed";
-               } else {
+               else
                        con->error_msg = "unrecognized con state";
-               }
                goto fault;
        }