aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiam Howlett <liam.howlett@oracle.com>2022-11-07 16:38:35 +0000
committerAndrew Morton <akpm@linux-foundation.org>2022-11-08 15:57:25 -0800
commit9bbba5633488ee3e2903647c3484c4390ff39ea7 (patch)
tree29d07e9e978c048e12df7e5357b989526b08afe4
parent1fdbed657a4726639c4f17841fd2a0fb646c746e (diff)
downloadlinux-9bbba5633488ee3e2903647c3484c4390ff39ea7.tar.gz
maple_tree: fix depth tracking in maple_state
It is possible to confuse the depth tracking in the maple state by searching the same node for values. Fix the depth tracking by moving where the depth is incremented closer to where the node changes level. Also change the initial depth setting when using the root node. Link: https://lkml.kernel.org/r/20221107163814.866612-1-Liam.Howlett@oracle.com Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--lib/maple_tree.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index f23f11da4113b..59d0cebc774bc 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -1351,6 +1351,7 @@ static inline struct maple_enode *mas_start(struct ma_state *mas)
root = mas_root(mas);
/* Tree with nodes */
if (likely(xa_is_node(root))) {
+ mas->depth = 1;
mas->node = mte_safe_root(root);
return NULL;
}
@@ -3727,7 +3728,6 @@ static bool mas_is_span_wr(struct ma_wr_state *wr_mas)
static inline void mas_wr_walk_descend(struct ma_wr_state *wr_mas)
{
- wr_mas->mas->depth++;
wr_mas->type = mte_node_type(wr_mas->mas->node);
mas_wr_node_walk(wr_mas);
wr_mas->slots = ma_slots(wr_mas->node, wr_mas->type);
@@ -3739,6 +3739,7 @@ static inline void mas_wr_walk_traverse(struct ma_wr_state *wr_mas)
wr_mas->mas->min = wr_mas->r_min;
wr_mas->mas->node = wr_mas->content;
wr_mas->mas->offset = 0;
+ wr_mas->mas->depth++;
}
/*
* mas_wr_walk() - Walk the tree for a write.