*/
static inline void mas_replace(struct ma_state *mas, bool advanced)
{
- struct maple_node *mn = mas_mn(mas);
- struct maple_enode *parent = NULL;
- struct maple_enode *prev;
- unsigned char slot = 0;
+ struct maple_node *parent, *mn = mas_mn(mas);
+ struct maple_enode *prev, *eparent = NULL;
+ unsigned char offset = 0;
+ void **slots;
if (mte_is_root(mas->node)) {
prev = mas->tree->ma_root;
} else {
enum maple_type ptype = mas_parent_enum(mas, mas->node);
- parent = mt_mk_node(mte_parent(mas->node), ptype);
- slot = mte_parent_slot(mas->node);
- prev = mte_get_slot(parent, slot, mas->tree);
+ parent = mte_parent(mas->node);
+ eparent = mt_mk_node(parent, ptype);
+ offset = mte_parent_slot(mas->node);
+ slots = ma_get_slots(parent, ptype);
+ prev = slots[offset];
}
if (mte_to_node(prev) == mn)
rcu_assign_pointer(mas->tree->ma_root, mte_mk_root(mas->node));
mas_set_height(mas);
} else {
- mte_set_slot(parent, slot, mas->node);
+ mte_set_slot(eparent, offset, mas->node);
}
if (!advanced)