Whamcloud - gitweb
LU-17431 nodemap: introduce helper funcs for range handling 35/54735/9
authorSebastien Buisson <sbuisson@ddn.com>
Tue, 26 Mar 2024 16:11:10 +0000 (17:11 +0100)
committerOleg Drokin <green@whamcloud.com>
Sun, 2 Feb 2025 06:23:16 +0000 (06:23 +0000)
Introduce helper functions for NID range handling on nodemaps,
to make it possible to use recursively for NID4 ranges:
__range_insert
__range_find
__range_search
__range_delete

Test-Parameters: trivial
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: I1ec0dff1c38111621678a0e79e00c7789bcc5b8b
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54735
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ptlrpc/nodemap_range.c

index 6338e71..9154d26 100644 (file)
@@ -156,6 +156,30 @@ struct lu_nid_range *range_create(struct nodemap_config *config,
  * \param      end_nid                 ending nid
  * \retval     matching range or NULL
  */
+static
+struct lu_nid_range *__range_find(struct nodemap_range_tree *nm_range_tree,
+                                 const struct lnet_nid *start_nid,
+                                 const struct lnet_nid *end_nid)
+{
+       struct lu_nid_range *range;
+       lnet_nid_t nid4[2];
+
+       if (!nid_is_nid4(start_nid) || !nid_is_nid4(end_nid))
+               return NULL;
+
+       nid4[0] = lnet_nid_to_nid4(start_nid);
+       nid4[1] = lnet_nid_to_nid4(end_nid);
+
+       range = nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
+                                   nid4[0], nid4[1]);
+       while (range &&
+              (!nid_same(&range->rn_start, start_nid) ||
+               !nid_same(&range->rn_end, end_nid)))
+               range = nm_range_iter_next(range, nid4[0], nid4[1]);
+
+       return range;
+}
+
 struct lu_nid_range *range_find(struct nodemap_config *config,
                                const struct lnet_nid *start_nid,
                                const struct lnet_nid *end_nid,
@@ -164,23 +188,8 @@ struct lu_nid_range *range_find(struct nodemap_config *config,
        struct lu_nid_range *range = NULL;
 
        if (!netmask) {
-               struct nodemap_range_tree *nm_range_tree;
-               lnet_nid_t nid4[2];
-
-               if (!nid_is_nid4(start_nid) || !nid_is_nid4(end_nid))
-                       return NULL;
-
-               nid4[0] = lnet_nid_to_nid4(start_nid);
-               nid4[1] = lnet_nid_to_nid4(end_nid);
-               nm_range_tree = &config->nmc_range_tree;
-               range = nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
-                                           nid4[0], nid4[1]);
-               while (range &&
-                      (!nid_same(&range->rn_start, start_nid) ||
-                       !nid_same(&range->rn_end, end_nid)))
-                       range = nm_range_iter_next(range, nid4[0], nid4[1]);
-
-               return range;
+               return __range_find(&config->nmc_range_tree,
+                                   start_nid, end_nid);
        }
 
        if (!list_empty(&config->nmc_netmask_setup)) {
@@ -214,7 +223,7 @@ void range_destroy(struct lu_nid_range *range)
 }
 
 /*
- * insert an nid range into the interval tree
+ * insert a nid range into the interval tree
  *
  * \param      range           range to insert
  * \retval     0 on success
@@ -223,19 +232,25 @@ void range_destroy(struct lu_nid_range *range)
  * does not overlap so that each nid can belong
  * to exactly one range
  */
-int range_insert(struct nodemap_config *config, struct lu_nid_range *range)
+static int __range_insert(struct nodemap_range_tree *nm_range_tree,
+                         struct lu_nid_range *range)
 {
-       if (!range->rn_netmask) {
-               struct nodemap_range_tree *nm_range_tree;
+       if (nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
+                               lnet_nid_to_nid4(&range->rn_start),
+                               lnet_nid_to_nid4(&range->rn_end)))
+               return -EEXIST;
 
-               nm_range_tree = &config->nmc_range_tree;
-               if (nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
-                                       lnet_nid_to_nid4(&range->rn_start),
-                                       lnet_nid_to_nid4(&range->rn_end)))
-                       return -EEXIST;
+       nm_range_insert(range,
+                       &nm_range_tree->nmrt_range_interval_root);
+       return 0;
+}
 
-               nm_range_insert(range,
-                               &nm_range_tree->nmrt_range_interval_root);
+int range_insert(struct nodemap_config *config, struct lu_nid_range *range)
+{
+       int rc = 0;
+
+       if (!range->rn_netmask) {
+               rc = __range_insert(&config->nmc_range_tree, range);
        } else {
                if (range_find(config, &range->rn_start, &range->rn_end,
                               range->rn_netmask))
@@ -243,7 +258,8 @@ int range_insert(struct nodemap_config *config, struct lu_nid_range *range)
 
                list_add(&range->rn_collect, &config->nmc_netmask_setup);
        }
-       return 0;
+
+       return rc;
 }
 
 /*
@@ -252,18 +268,22 @@ int range_insert(struct nodemap_config *config, struct lu_nid_range *range)
  *
  * \param      range           range to remove
  */
+void __range_delete(struct nodemap_range_tree *nm_range_tree,
+                   struct lu_nid_range *range)
+{
+       nm_range_remove(range,
+                       &nm_range_tree->nmrt_range_interval_root);
+}
+
 void range_delete(struct nodemap_config *config, struct lu_nid_range *range)
 {
        list_del(&range->rn_list);
-       if (!range->rn_netmask) {
-               struct nodemap_range_tree *nm_range_tree;
 
-               nm_range_tree = &config->nmc_range_tree;
-               nm_range_remove(range,
-                               &nm_range_tree->nmrt_range_interval_root);
-       } else {
+       if (!range->rn_netmask)
+               __range_delete(&config->nmc_range_tree, range);
+       else
                list_del(&range->rn_collect);
-       }
+
        range_destroy(range);
 }
 
@@ -272,16 +292,20 @@ void range_delete(struct nodemap_config *config, struct lu_nid_range *range)
  *
  * \param      nid             nid to search for
  */
+static
+struct lu_nid_range *__range_search(struct nodemap_range_tree *nm_range_tree,
+                                   struct lnet_nid *nid)
+{
+       return nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
+                                  lnet_nid_to_nid4(nid),
+                                  lnet_nid_to_nid4(nid));
+}
+
 struct lu_nid_range *range_search(struct nodemap_config *config,
                                  struct lnet_nid *nid)
 {
        if (nid_is_nid4(nid)) {
-               struct nodemap_range_tree *nm_range_tree;
-
-               nm_range_tree = &config->nmc_range_tree;
-               return nm_range_iter_first(&nm_range_tree->nmrt_range_interval_root,
-                                          lnet_nid_to_nid4(nid),
-                                          lnet_nid_to_nid4(nid));
+               return __range_search(&config->nmc_range_tree, nid);
        }
 
        if (!list_empty(&config->nmc_netmask_setup)) {