From 1ce1032a03dd26345e662164b7877079c54468f5 Mon Sep 17 00:00:00 2001 From: Kit Westneat Date: Tue, 5 Jul 2016 13:23:52 -0400 Subject: [PATCH] LU-8357 nodemap: reclassify nodemap requires active conf lock A couple of call paths did not take the lock, which led to race conditions. This patch ensures that those calls are under lock. Signed-off-by: Kit Westneat Change-Id: I3db8203b0b6d7d02a02cbe1c3ed6c847915d0076 Reviewed-on: http://review.whamcloud.com/21159 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: John L. Hammond Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/ptlrpc/nodemap_handler.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lustre/ptlrpc/nodemap_handler.c b/lustre/ptlrpc/nodemap_handler.c index e80247a..a416c90 100644 --- a/lustre/ptlrpc/nodemap_handler.c +++ b/lustre/ptlrpc/nodemap_handler.c @@ -777,15 +777,21 @@ int nodemap_add_range_helper(struct nodemap_config *config, } list_add(&range->rn_list, &nodemap->nm_ranges); - nm_member_reclassify_nodemap(config->nmc_default_nodemap); + + /* nodemaps have no members if they aren't on the active config */ + if (config == active_config) + nm_member_reclassify_nodemap(config->nmc_default_nodemap); + up_write(&config->nmc_range_tree_lock); /* if range_id is non-zero, we are loading from disk */ if (range_id == 0) rc = nodemap_idx_range_add(range, nid); - nm_member_revoke_locks(config->nmc_default_nodemap); - nm_member_revoke_locks(nodemap); + if (config == active_config) { + nm_member_revoke_locks(config->nmc_default_nodemap); + nm_member_revoke_locks(nodemap); + } out: return rc; @@ -1375,15 +1381,18 @@ void nodemap_config_dealloc(struct nodemap_config *config) */ list_for_each_entry_safe(nodemap, nodemap_temp, &nodemap_list_head, nm_list) { + mutex_lock(&active_config_lock); down_write(&config->nmc_range_tree_lock); - /* move members to new config */ + /* move members to new config, requires ac lock */ nm_member_reclassify_nodemap(nodemap); list_for_each_entry_safe(range, range_temp, &nodemap->nm_ranges, rn_list) range_delete(&config->nmc_range_tree, range); up_write(&config->nmc_range_tree_lock); + mutex_unlock(&active_config_lock); + /* putref must be outside of ac lock if nm could be destroyed */ nodemap_putref(nodemap); } OBD_FREE_PTR(config); -- 1.8.3.1