Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e5f2825 authored by Patrick Caulfield's avatar Patrick Caulfield Committed by Steven Whitehouse
Browse files

[DLM] More othercon fixes



The last patch to clean out 'othercon' structures only fixed half the problem.
The attached addresses the other situations too, and fixes bz#238490

Signed-Off-By: default avatarPatrick Caulfield <pcaulfie@redhat.com>
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 1a2bf2ee
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -328,16 +328,25 @@ static void close_connection(struct connection *con, bool and_other)
	if (con->othercon && and_other) {
		/* Will only re-enter once. */
		close_connection(con->othercon, false);
		kmem_cache_free(con_cache, con->othercon);
		con->othercon = NULL;
	}
	if (con->rx_page) {
		__free_page(con->rx_page);
		con->rx_page = NULL;
	}

	/* If we are an 'othercon' then NULL the pointer to us
	   from the parent and tidy ourself up */
	if (test_bit(CF_IS_OTHERCON, &con->flags)) {
		struct connection *parent = __nodeid2con(con->nodeid, 0);
		parent->othercon = NULL;
		kmem_cache_free(con_cache, con);
	}
	else {
		/* Parent connections get reused */
		con->retries = 0;
		mutex_unlock(&con->sock_mutex);
	}
}

/* We only send shutdown messages to nodes that are not part of the cluster */
static void sctp_send_shutdown(sctp_assoc_t associd)
@@ -634,7 +643,7 @@ out_resched:

out_close:
	mutex_unlock(&con->sock_mutex);
	if (ret != -EAGAIN && !test_bit(CF_IS_OTHERCON, &con->flags)) {
	if (ret != -EAGAIN) {
		close_connection(con, false);
		/* Reconnect when there is something to send */
	}
@@ -1125,8 +1134,6 @@ static int tcp_listen_for_all(void)

	log_print("Using TCP for communications");

	set_bit(CF_IS_OTHERCON, &con->flags);

	sock = tcp_create_listen_sock(con, dlm_local_addr[0]);
	if (sock) {
		add_sock(sock, con);
@@ -1410,7 +1417,7 @@ void dlm_lowcomms_stop(void)
	for (i = 0; i <= max_nodeid; i++) {
		con = __nodeid2con(i, 0);
		if (con) {
			con->flags |= 0xFF;
			con->flags |= 0x0F;
			if (con->sock)
				con->sock->sk->sk_user_data = NULL;
		}
@@ -1426,8 +1433,6 @@ void dlm_lowcomms_stop(void)
		con = __nodeid2con(i, 0);
		if (con) {
			close_connection(con, true);
			if (con->othercon)
				kmem_cache_free(con_cache, con->othercon);
			kmem_cache_free(con_cache, con);
		}
	}