diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 754fd6c0b747..bc04f5e3af7a 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -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,