* controlled to prevent read access during update operations.
*/
-static struct interval_node *range_interval_root;
-static atomic_t range_highest_id;
-
-void range_init_tree(void)
-{
- range_interval_root = NULL;
-}
-
/*
- * callback for interating over the interval tree
+ * callback for iterating over the interval tree
*
* \param n interval_node matched
* \param data void pointer for return
*
- * This dunction stops after a single match. There should be
+ * This function stops after a single match. There should be
* no intervals containing multiple ranges
*/
static enum interval_iter range_cb(struct interval_node *n, void *data)
* \param nodemap nodemap that contains this range
* \retval lu_nid_range on success, NULL on failure
*/
-struct lu_nid_range *range_create(lnet_nid_t start_nid, lnet_nid_t end_nid,
- struct lu_nodemap *nodemap)
+struct lu_nid_range *range_create(struct nodemap_range_tree *nm_range_tree,
+ lnet_nid_t start_nid, lnet_nid_t end_nid,
+ struct lu_nodemap *nodemap, unsigned range_id)
{
struct lu_nid_range *range;
return NULL;
}
- range->rn_id = atomic_inc_return(&range_highest_id);
+ /* if we are loading from save, use on disk id num */
+ if (range_id != 0) {
+ if (nm_range_tree->nmrt_range_highest_id < range_id)
+ nm_range_tree->nmrt_range_highest_id = range_id;
+ range->rn_id = range_id;
+ } else {
+ nm_range_tree->nmrt_range_highest_id++;
+ range->rn_id = nm_range_tree->nmrt_range_highest_id;
+ }
range->rn_nodemap = nodemap;
interval_set(&range->rn_node, start_nid, end_nid);
INIT_LIST_HEAD(&range->rn_list);
* \param end_nid ending nid
* \retval matching range or NULL
*/
-struct lu_nid_range *range_find(lnet_nid_t start_nid, lnet_nid_t end_nid)
+struct lu_nid_range *range_find(struct nodemap_range_tree *nm_range_tree,
+ lnet_nid_t start_nid, lnet_nid_t end_nid)
{
struct lu_nid_range *range = NULL;
struct interval_node *interval = NULL;
.end = end_nid
};
- interval = interval_find(range_interval_root, &ext);
+ interval = interval_find(nm_range_tree->nmrt_range_interval_root, &ext);
if (interval != NULL)
range = container_of(interval, struct lu_nid_range,
* does not overlap so that each nid can belong
* to exactly one range
*/
-int range_insert(struct lu_nid_range *range)
+int range_insert(struct nodemap_range_tree *nm_range_tree,
+ struct lu_nid_range *range)
{
struct interval_node_extent ext =
range->rn_node.in_extent;
- if (interval_is_overlapped(range_interval_root, &ext) != 0)
+ if (interval_is_overlapped(nm_range_tree->nmrt_range_interval_root,
+ &ext) != 0)
return -EEXIST;
- interval_insert(&range->rn_node, &range_interval_root);
+ interval_insert(&range->rn_node,
+ &nm_range_tree->nmrt_range_interval_root);
return 0;
}
*
* \param range range to remove
*/
-void range_delete(struct lu_nid_range *range)
+void range_delete(struct nodemap_range_tree *nm_range_tree,
+ struct lu_nid_range *range)
{
if (range == NULL || interval_is_intree(&range->rn_node) == 0)
return;
list_del(&range->rn_list);
- interval_erase(&range->rn_node, &range_interval_root);
+ interval_erase(&range->rn_node,
+ &nm_range_tree->nmrt_range_interval_root);
range_destroy(range);
}
*
* \param nid nid to search for
*/
-struct lu_nid_range *range_search(lnet_nid_t nid)
+struct lu_nid_range *range_search(struct nodemap_range_tree *nm_range_tree,
+ lnet_nid_t nid)
{
struct lu_nid_range *ret = NULL;
struct interval_node_extent ext = {
.end = nid
};
- interval_search(range_interval_root, &ext, range_cb, &ret);
+ interval_search(nm_range_tree->nmrt_range_interval_root, &ext,
+ range_cb, &ret);
return ret;
}