fs: dlm: handle non blocked connect event
[linux-2.6-microblaze.git] / fs / dlm / lowcomms.c
index c0c688a..193a4c9 100644 (file)
@@ -78,6 +78,7 @@ struct connection {
 #define CF_APP_LIMITED 7
 #define CF_CLOSING 8
 #define CF_SHUTDOWN 9
+#define CF_CONNECTED 10
        struct list_head writequeue;  /* List of outgoing writequeue_entries */
        spinlock_t writequeue_lock;
        int (*rx_action) (struct connection *); /* What to do when active */
@@ -419,6 +420,12 @@ static void lowcomms_write_space(struct sock *sk)
        if (!con)
                goto out;
 
+       if (!test_and_set_bit(CF_CONNECTED, &con->flags)) {
+               log_print("successful connected to node %d", con->nodeid);
+               queue_work(send_workqueue, &con->swork);
+               goto out;
+       }
+
        clear_bit(SOCK_NOSPACE, &con->sock->flags);
 
        if (test_and_clear_bit(CF_APP_LIMITED, &con->flags)) {
@@ -604,6 +611,7 @@ static void close_connection(struct connection *con, bool and_other,
 
        con->rx_leftover = 0;
        con->retries = 0;
+       clear_bit(CF_CONNECTED, &con->flags);
        mutex_unlock(&con->sock_mutex);
        clear_bit(CF_CLOSING, &con->flags);
 }
@@ -1027,8 +1035,11 @@ static void sctp_connect_to_sock(struct connection *con)
 
        if (result == -EINPROGRESS)
                result = 0;
-       if (result == 0)
+       if (result == 0) {
+               if (!test_and_set_bit(CF_CONNECTED, &con->flags))
+                       log_print("successful connected to node %d", con->nodeid);
                goto out;
+       }
 
 bind_err:
        con->sock = NULL;