mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
dlm: prevent connections during shutdown
During lowcomms shutdown, a new connection could possibly be created, and attempt to use a workqueue that's been destroyed. Similarly, during startup, a new connection could attempt to use a workqueue that's not been set up yet. Add a global variable to indicate when new connections are allowed. Based on patch by: Christine Caulfield <ccaulfie@redhat.com> Reported-by: dann frazier <dann.frazier@canonical.com> Reviewed-by: dann frazier <dann.frazier@canonical.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
af3a3ab296
commit
513ef596d4
@ -142,6 +142,7 @@ struct writequeue_entry {
|
||||
|
||||
static struct sockaddr_storage *dlm_local_addr[DLM_MAX_ADDR_COUNT];
|
||||
static int dlm_local_count;
|
||||
static int dlm_allow_conn;
|
||||
|
||||
/* Work queues */
|
||||
static struct workqueue_struct *recv_workqueue;
|
||||
@ -710,6 +711,13 @@ static int tcp_accept_from_sock(struct connection *con)
|
||||
struct connection *newcon;
|
||||
struct connection *addcon;
|
||||
|
||||
mutex_lock(&connections_lock);
|
||||
if (!dlm_allow_conn) {
|
||||
mutex_unlock(&connections_lock);
|
||||
return -1;
|
||||
}
|
||||
mutex_unlock(&connections_lock);
|
||||
|
||||
memset(&peeraddr, 0, sizeof(peeraddr));
|
||||
result = sock_create_kern(dlm_local_addr[0]->ss_family, SOCK_STREAM,
|
||||
IPPROTO_TCP, &newsock);
|
||||
@ -1503,6 +1511,7 @@ void dlm_lowcomms_stop(void)
|
||||
socket activity.
|
||||
*/
|
||||
mutex_lock(&connections_lock);
|
||||
dlm_allow_conn = 0;
|
||||
foreach_conn(stop_conn);
|
||||
mutex_unlock(&connections_lock);
|
||||
|
||||
@ -1530,7 +1539,7 @@ int dlm_lowcomms_start(void)
|
||||
if (!dlm_local_count) {
|
||||
error = -ENOTCONN;
|
||||
log_print("no local IP address has been set");
|
||||
goto out;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
error = -ENOMEM;
|
||||
@ -1538,7 +1547,13 @@ int dlm_lowcomms_start(void)
|
||||
__alignof__(struct connection), 0,
|
||||
NULL);
|
||||
if (!con_cache)
|
||||
goto out;
|
||||
goto fail;
|
||||
|
||||
error = work_start();
|
||||
if (error)
|
||||
goto fail_destroy;
|
||||
|
||||
dlm_allow_conn = 1;
|
||||
|
||||
/* Start listening */
|
||||
if (dlm_config.ci_protocol == 0)
|
||||
@ -1548,20 +1563,17 @@ int dlm_lowcomms_start(void)
|
||||
if (error)
|
||||
goto fail_unlisten;
|
||||
|
||||
error = work_start();
|
||||
if (error)
|
||||
goto fail_unlisten;
|
||||
|
||||
return 0;
|
||||
|
||||
fail_unlisten:
|
||||
dlm_allow_conn = 0;
|
||||
con = nodeid2con(0,0);
|
||||
if (con) {
|
||||
close_connection(con, false);
|
||||
kmem_cache_free(con_cache, con);
|
||||
}
|
||||
fail_destroy:
|
||||
kmem_cache_destroy(con_cache);
|
||||
|
||||
out:
|
||||
fail:
|
||||
return error;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user