| From 3a8db79889ce16930aff19b818f5b09651bb7644 Mon Sep 17 00:00:00 2001 |
| From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> |
| Date: Sat, 8 Oct 2016 10:14:37 -0300 |
| Subject: dlm: free workqueues after the connections |
| |
| From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> |
| |
| commit 3a8db79889ce16930aff19b818f5b09651bb7644 upstream. |
| |
| After backporting commit ee44b4bc054a ("dlm: use sctp 1-to-1 API") |
| series to a kernel with an older workqueue which didn't use RCU yet, it |
| was noticed that we are freeing the workqueues in dlm_lowcomms_stop() |
| too early as free_conn() will try to access that memory for canceling |
| the queued works if any. |
| |
| This issue was introduced by commit 0d737a8cfd83 as before it such |
| attempt to cancel the queued works wasn't performed, so the issue was |
| not present. |
| |
| This patch fixes it by simply inverting the free order. |
| |
| Fixes: 0d737a8cfd83 ("dlm: fix race while closing connections") |
| Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> |
| Signed-off-by: David Teigland <teigland@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/dlm/lowcomms.c | 8 ++------ |
| 1 file changed, 2 insertions(+), 6 deletions(-) |
| |
| --- a/fs/dlm/lowcomms.c |
| +++ b/fs/dlm/lowcomms.c |
| @@ -1656,16 +1656,12 @@ void dlm_lowcomms_stop(void) |
| mutex_lock(&connections_lock); |
| dlm_allow_conn = 0; |
| foreach_conn(stop_conn); |
| + clean_writequeues(); |
| + foreach_conn(free_conn); |
| mutex_unlock(&connections_lock); |
| |
| work_stop(); |
| |
| - mutex_lock(&connections_lock); |
| - clean_writequeues(); |
| - |
| - foreach_conn(free_conn); |
| - |
| - mutex_unlock(&connections_lock); |
| kmem_cache_destroy(con_cache); |
| } |
| |