From 14acb0ba2040b69ac4b6105b3ee732530807f310 Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Thu, 3 Jan 2019 10:34:32 -0500 Subject: [PATCH] maple_tree: Implement destroy. Signed-off-by: Liam R. Howlett --- lib/maple_tree.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/maple_tree.c b/lib/maple_tree.c index a900ffea13f8..06465e580e31 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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 -- 2.50.1