dlm: fix connection stealing if using SCTP
[cascardo/linux.git] / fs / dlm / lowcomms.c
index 754fd6c..bc04f5e 100644 (file)
@@ -535,7 +535,9 @@ static void close_connection(struct connection *con, bool and_other)
        mutex_unlock(&con->sock_mutex);
 }
 
-/* We only send shutdown messages to nodes that are not part of the cluster */
+/* We only send shutdown messages to nodes that are not part of the cluster
+ * or if we get multiple connections from a node.
+ */
 static void sctp_send_shutdown(sctp_assoc_t associd)
 {
        static char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
@@ -718,6 +720,14 @@ static void process_sctp_notification(struct connection *con,
                        if (!new_con)
                                return;
 
+                       if (new_con->sock) {
+                               log_print("reject connect from node %d: "
+                                         "already has a connection.",
+                                         nodeid);
+                               sctp_send_shutdown(prim.ssp_assoc_id);
+                               return;
+                       }
+
                        /* Peel off a new sock */
                        lock_sock(con->sock->sk);
                        ret = sctp_do_peeloff(con->sock->sk,