This patch adds an additional check if the "fenced" node is part of any lockspace. A node should not be part of any lockspace when it's got fenced. This is an additional requirement besides that all lockspace activity should be stopped before calling dlm_midcomms_close().
Signed-off-by: Alexander Aring <aahri...@redhat.com> --- fs/dlm/lockspace.c | 5 ++++- fs/dlm/lockspace.h | 2 +- fs/dlm/midcomms.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index 0c3613d09c5e..a4f492189a08 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c @@ -923,12 +923,15 @@ void dlm_stop_lockspaces(void) log_print("dlm user daemon left %d lockspaces", count); } -void dlm_stop_lockspaces_check(void) +void dlm_stop_lockspaces_check(int nodeid) { struct dlm_ls *ls; spin_lock(&lslist_lock); list_for_each_entry(ls, &lslist, ls_list) { + if (WARN_ON(dlm_is_member(ls, nodeid))) + break; + if (WARN_ON(!rwsem_is_locked(&ls->ls_in_recovery) || !dlm_locking_stopped(ls))) break; diff --git a/fs/dlm/lockspace.h b/fs/dlm/lockspace.h index 306fc4f4ea15..9d1ea1013650 100644 --- a/fs/dlm/lockspace.h +++ b/fs/dlm/lockspace.h @@ -19,7 +19,7 @@ struct dlm_ls *dlm_find_lockspace_local(void *id); struct dlm_ls *dlm_find_lockspace_device(int minor); void dlm_put_lockspace(struct dlm_ls *ls); void dlm_stop_lockspaces(void); -void dlm_stop_lockspaces_check(void); +void dlm_stop_lockspaces_check(int nodeid); #endif /* __LOCKSPACE_DOT_H__ */ diff --git a/fs/dlm/midcomms.c b/fs/dlm/midcomms.c index 6489bc22ad61..22037183f565 100644 --- a/fs/dlm/midcomms.c +++ b/fs/dlm/midcomms.c @@ -1413,7 +1413,7 @@ int dlm_midcomms_close(int nodeid) if (nodeid == dlm_our_nodeid()) return 0; - dlm_stop_lockspaces_check(); + dlm_stop_lockspaces_check(nodeid); idx = srcu_read_lock(&nodes_srcu); /* Abort pending close/remove operation */ -- 2.31.1