]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Implement destroy.
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Thu, 3 Jan 2019 15:34:32 +0000 (10:34 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 31 Jul 2019 14:52:34 +0000 (10:52 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index a900ffea13f89594e9630c4b04a5541b794d7678..06465e580e314f7ee446439634327569bbf429f0 100644 (file)
@@ -408,6 +408,28 @@ void *mas_walk(struct ma_state *ms)
        return entry;
 }
 
+void *ma_destroy_walk(struct ma_state *mas)
+{
+       struct maple_node *mn = mas->node;
+       unsigned int type = mt_node_type(mas->node);
+       int i;
+
+       switch (type) {
+       case maple_leaf_64:
+               break;
+       case maple_range_64:
+               for (i = 0; i < MAPLE_RANGE64_SLOTS; i++) {
+                       if (i > 0 && mn->mr64.pivot[i] == 0)
+                               break;
+                       ma_destroy_walk(mn->mr64.slot[i]);
+               }
+               break;
+       default:
+               break;
+       }
+       mt_free(mn);
+}
+
 /* Interface */
 void __init maple_tree_init(void)
 {
@@ -473,7 +495,16 @@ int mtree_erase(struct maple_tree *mt, unsigned long index)
 
 void mtree_destroy(struct maple_tree *mt)
 {
+       MA_STATE(ms, mt, 0, 0);
+       mtree_lock(mt);
+       if (xa_is_node(mt->ma_root)) {
+               ms.node = mt_to_node(mt->ma_root);
+               ma_destroy_walk(&ms);
+       }
+       mt->ma_root = NULL;
+       mtree_unlock(mt);
 }
+EXPORT_SYMBOL(mtree_destroy);
 
 
 #ifdef MT_DEBUG