diff options
Diffstat (limited to 'fs/dlm')
-rw-r--r-- | fs/dlm/lowcomms.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 631bc431e6af..9e9d2e82f40f 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c | |||
@@ -328,15 +328,24 @@ static void close_connection(struct connection *con, bool and_other) | |||
328 | if (con->othercon && and_other) { | 328 | if (con->othercon && and_other) { |
329 | /* Will only re-enter once. */ | 329 | /* Will only re-enter once. */ |
330 | close_connection(con->othercon, false); | 330 | close_connection(con->othercon, false); |
331 | kmem_cache_free(con_cache, con->othercon); | ||
332 | con->othercon = NULL; | ||
333 | } | 331 | } |
334 | if (con->rx_page) { | 332 | if (con->rx_page) { |
335 | __free_page(con->rx_page); | 333 | __free_page(con->rx_page); |
336 | con->rx_page = NULL; | 334 | con->rx_page = NULL; |
337 | } | 335 | } |
338 | con->retries = 0; | 336 | |
339 | mutex_unlock(&con->sock_mutex); | 337 | /* If we are an 'othercon' then NULL the pointer to us |
338 | from the parent and tidy ourself up */ | ||
339 | if (test_bit(CF_IS_OTHERCON, &con->flags)) { | ||
340 | struct connection *parent = __nodeid2con(con->nodeid, 0); | ||
341 | parent->othercon = NULL; | ||
342 | kmem_cache_free(con_cache, con); | ||
343 | } | ||
344 | else { | ||
345 | /* Parent connections get reused */ | ||
346 | con->retries = 0; | ||
347 | mutex_unlock(&con->sock_mutex); | ||
348 | } | ||
340 | } | 349 | } |
341 | 350 | ||
342 | /* We only send shutdown messages to nodes that are not part of the cluster */ | 351 | /* We only send shutdown messages to nodes that are not part of the cluster */ |
@@ -634,7 +643,7 @@ out_resched: | |||
634 | 643 | ||
635 | out_close: | 644 | out_close: |
636 | mutex_unlock(&con->sock_mutex); | 645 | mutex_unlock(&con->sock_mutex); |
637 | if (ret != -EAGAIN && !test_bit(CF_IS_OTHERCON, &con->flags)) { | 646 | if (ret != -EAGAIN) { |
638 | close_connection(con, false); | 647 | close_connection(con, false); |
639 | /* Reconnect when there is something to send */ | 648 | /* Reconnect when there is something to send */ |
640 | } | 649 | } |
@@ -1125,8 +1134,6 @@ static int tcp_listen_for_all(void) | |||
1125 | 1134 | ||
1126 | log_print("Using TCP for communications"); | 1135 | log_print("Using TCP for communications"); |
1127 | 1136 | ||
1128 | set_bit(CF_IS_OTHERCON, &con->flags); | ||
1129 | |||
1130 | sock = tcp_create_listen_sock(con, dlm_local_addr[0]); | 1137 | sock = tcp_create_listen_sock(con, dlm_local_addr[0]); |
1131 | if (sock) { | 1138 | if (sock) { |
1132 | add_sock(sock, con); | 1139 | add_sock(sock, con); |
@@ -1410,7 +1417,7 @@ void dlm_lowcomms_stop(void) | |||
1410 | for (i = 0; i <= max_nodeid; i++) { | 1417 | for (i = 0; i <= max_nodeid; i++) { |
1411 | con = __nodeid2con(i, 0); | 1418 | con = __nodeid2con(i, 0); |
1412 | if (con) { | 1419 | if (con) { |
1413 | con->flags |= 0xFF; | 1420 | con->flags |= 0x0F; |
1414 | if (con->sock) | 1421 | if (con->sock) |
1415 | con->sock->sk->sk_user_data = NULL; | 1422 | con->sock->sk->sk_user_data = NULL; |
1416 | } | 1423 | } |
@@ -1426,8 +1433,6 @@ void dlm_lowcomms_stop(void) | |||
1426 | con = __nodeid2con(i, 0); | 1433 | con = __nodeid2con(i, 0); |
1427 | if (con) { | 1434 | if (con) { |
1428 | close_connection(con, true); | 1435 | close_connection(con, true); |
1429 | if (con->othercon) | ||
1430 | kmem_cache_free(con_cache, con->othercon); | ||
1431 | kmem_cache_free(con_cache, con); | 1436 | kmem_cache_free(con_cache, con); |
1432 | } | 1437 | } |
1433 | } | 1438 | } |