From ca6c874da9ff2e27f98e151a816818970af8b342 Mon Sep 17 00:00:00 2001 From: Chris Horn Date: Fri, 23 Aug 2024 11:40:17 -0600 Subject: [PATCH] LU-18167 nodemap: Fix return value of range_search/find The 'range = NULL' assignments in range_search() and range_find() are no-ops because the list_for_each_entry_safe macro will set range to some non-NULL value before the loop exits. Thus, range_search() and range_find() can return a non-NULL value even when it doesn't match the NID we are searching for. Modify the loops to return range immediately upon finding a match. Test-Parameters: trivial Test-Parameters: testlist=sanity-sec env=ONLY=16,LOAD_MODULES_REMOTE=true,FORCE_LARGE_NID=true Fixes: 0ea23e0194 ("LU-13307 nodemap: have nodemap_add_member support large NIDs") Signed-off-by: Chris Horn Change-Id: Id00a2b73da127afaf94d1ecf5d1ef0080d11c6fd Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56137 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Reviewed-by: Sebastien Buisson --- lustre/ptlrpc/nodemap_range.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/lustre/ptlrpc/nodemap_range.c b/lustre/ptlrpc/nodemap_range.c index 35ed82f..f71130b 100644 --- a/lustre/ptlrpc/nodemap_range.c +++ b/lustre/ptlrpc/nodemap_range.c @@ -137,7 +137,11 @@ struct lu_nid_range *range_find(struct nodemap_config *config, (!nid_same(&range->rn_start, start_nid) || !nid_same(&range->rn_end, end_nid))) range = nm_range_iter_next(range, nid4[0], nid4[1]); - } else if (!list_empty(&config->nmc_netmask_setup)) { + + return range; + } + + if (!list_empty(&config->nmc_netmask_setup)) { struct lu_nid_range *range_temp; /* FIXME. We scan the config for large NIDs. Each range @@ -148,11 +152,11 @@ struct lu_nid_range *range_find(struct nodemap_config *config, rn_collect) { if (nid_same(&range->rn_start, start_nid) && range->rn_netmask == netmask) - break; - range = NULL; + return range; } } - return range; + + return NULL; } /* @@ -223,17 +227,15 @@ void range_delete(struct nodemap_config *config, struct lu_nid_range *range) struct lu_nid_range *range_search(struct nodemap_config *config, struct lnet_nid *nid) { - struct lu_nid_range *range = NULL; - if (nid_is_nid4(nid)) { struct nodemap_range_tree *nm_range_tree; nm_range_tree = &config->nmc_range_tree; - range = nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root, - lnet_nid_to_nid4(nid), - lnet_nid_to_nid4(nid)); + return nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root, + lnet_nid_to_nid4(nid), + lnet_nid_to_nid4(nid)); } else if (!list_empty(&config->nmc_netmask_setup)) { - struct lu_nid_range *range_temp; + struct lu_nid_range *range, *range_temp; /* FIXME. We scan the config for the large NIDs. Each range * only contains one large NID for now. @@ -242,10 +244,9 @@ struct lu_nid_range *range_search(struct nodemap_config *config, &config->nmc_netmask_setup, rn_collect) { if (nid_same(&range->rn_start, nid)) - break; - range = NULL; + return range; } } - return range; + return NULL; } -- 1.8.3.1