Commit bf96715e authored by Liam R. Howlett's avatar Liam R. Howlett Committed by Andrew Morton

maple_tree: use MAS_BUG_ON() when setting a leaf node as a parent

Use MAS_BUG_ON() to dump the maple state and tree in the unlikely event of
an issue.

Link: https://lkml.kernel.org/r/20230518145544.1722059-11-Liam.Howlett@oracle.comSigned-off-by: default avatarLiam R. Howlett <Liam.Howlett@oracle.com>
Cc: David Binderman <dcb314@hotmail.com>
Cc: Peng Zhang <zhangpeng.00@bytedance.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Vernon Yang <vernon2gm@gmail.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent e6d6792a
...@@ -453,7 +453,7 @@ enum maple_type mas_parent_type(struct ma_state *mas, struct maple_enode *enode) ...@@ -453,7 +453,7 @@ enum maple_type mas_parent_type(struct ma_state *mas, struct maple_enode *enode)
} }
/* /*
* mte_set_parent() - Set the parent node and encode the slot * mas_set_parent() - Set the parent node and encode the slot
* @enode: The encoded maple node. * @enode: The encoded maple node.
* @parent: The encoded maple node that is the parent of @enode. * @parent: The encoded maple node that is the parent of @enode.
* @slot: The slot that @enode resides in @parent. * @slot: The slot that @enode resides in @parent.
...@@ -462,16 +462,16 @@ enum maple_type mas_parent_type(struct ma_state *mas, struct maple_enode *enode) ...@@ -462,16 +462,16 @@ enum maple_type mas_parent_type(struct ma_state *mas, struct maple_enode *enode)
* parent type. * parent type.
*/ */
static inline static inline
void mte_set_parent(struct maple_enode *enode, const struct maple_enode *parent, void mas_set_parent(struct ma_state *mas, struct maple_enode *enode,
unsigned char slot) const struct maple_enode *parent, unsigned char slot)
{ {
unsigned long val = (unsigned long)parent; unsigned long val = (unsigned long)parent;
unsigned long shift; unsigned long shift;
unsigned long type; unsigned long type;
enum maple_type p_type = mte_node_type(parent); enum maple_type p_type = mte_node_type(parent);
BUG_ON(p_type == maple_dense); MAS_BUG_ON(mas, p_type == maple_dense);
BUG_ON(p_type == maple_leaf_64); MAS_BUG_ON(mas, p_type == maple_leaf_64);
switch (p_type) { switch (p_type) {
case maple_range_64: case maple_range_64:
...@@ -1740,7 +1740,7 @@ static inline void mas_adopt_children(struct ma_state *mas, ...@@ -1740,7 +1740,7 @@ static inline void mas_adopt_children(struct ma_state *mas,
offset = ma_data_end(node, type, pivots, mas->max); offset = ma_data_end(node, type, pivots, mas->max);
do { do {
child = mas_slot_locked(mas, slots, offset); child = mas_slot_locked(mas, slots, offset);
mte_set_parent(child, parent, offset); mas_set_parent(mas, child, parent, offset);
} while (offset--); } while (offset--);
} }
...@@ -2705,9 +2705,9 @@ static inline void mas_set_split_parent(struct ma_state *mas, ...@@ -2705,9 +2705,9 @@ static inline void mas_set_split_parent(struct ma_state *mas,
return; return;
if ((*slot) <= split) if ((*slot) <= split)
mte_set_parent(mas->node, left, *slot); mas_set_parent(mas, mas->node, left, *slot);
else if (right) else if (right)
mte_set_parent(mas->node, right, (*slot) - split - 1); mas_set_parent(mas, mas->node, right, (*slot) - split - 1);
(*slot)++; (*slot)++;
} }
...@@ -3104,12 +3104,12 @@ static int mas_spanning_rebalance(struct ma_state *mas, ...@@ -3104,12 +3104,12 @@ static int mas_spanning_rebalance(struct ma_state *mas,
mte_node_type(mast->orig_l->node)); mte_node_type(mast->orig_l->node));
mast->orig_l->depth++; mast->orig_l->depth++;
mab_mas_cp(mast->bn, 0, mt_slots[mast->bn->type] - 1, &l_mas, true); mab_mas_cp(mast->bn, 0, mt_slots[mast->bn->type] - 1, &l_mas, true);
mte_set_parent(left, l_mas.node, slot); mas_set_parent(mas, left, l_mas.node, slot);
if (middle) if (middle)
mte_set_parent(middle, l_mas.node, ++slot); mas_set_parent(mas, middle, l_mas.node, ++slot);
if (right) if (right)
mte_set_parent(right, l_mas.node, ++slot); mas_set_parent(mas, right, l_mas.node, ++slot);
if (mas_is_root_limits(mast->l)) { if (mas_is_root_limits(mast->l)) {
new_root: new_root:
...@@ -3336,8 +3336,8 @@ static inline bool mas_split_final_node(struct maple_subtree_state *mast, ...@@ -3336,8 +3336,8 @@ static inline bool mas_split_final_node(struct maple_subtree_state *mast,
* The Big_node data should just fit in a single node. * The Big_node data should just fit in a single node.
*/ */
ancestor = mas_new_ma_node(mas, mast->bn); ancestor = mas_new_ma_node(mas, mast->bn);
mte_set_parent(mast->l->node, ancestor, mast->l->offset); mas_set_parent(mas, mast->l->node, ancestor, mast->l->offset);
mte_set_parent(mast->r->node, ancestor, mast->r->offset); mas_set_parent(mas, mast->r->node, ancestor, mast->r->offset);
mte_to_node(ancestor)->parent = mas_mn(mas)->parent; mte_to_node(ancestor)->parent = mas_mn(mas)->parent;
mast->l->node = ancestor; mast->l->node = ancestor;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment