]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: refactor mas_split data splitting
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Thu, 13 Aug 2020 00:25:00 +0000 (20:25 -0400)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 30 Oct 2020 19:09:10 +0000 (15:09 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index a6bd76444f551d855af4c50fbbc81bd98cf164bf..dd1ce54fa42438cb676f1b037becb75f2e25494e 100644 (file)
@@ -2472,14 +2472,33 @@ static inline void mast_split_fill_bnode(struct maple_subtree_state *mast,
        mast->bn->type = mte_node_type(mas->node);
 }
 
+
+static inline void mast_split_data(struct maple_subtree_state *mast,
+                                  struct ma_state *mas)
+{
+       unsigned char p_slot, mid_split, split = 0;
+
+       split = mab_calc_split(mast->bn, &mid_split);
+       mab_mas_cp(mast->bn, 0, split, mast->l);
+       mte_set_pivot(mast->r->node, 0, mast->r->max);
+       mab_mas_cp(mast->bn, split + 1, mast->bn->b_end, mast->r);
+       mas_set_slot(mast->l, mte_parent_slot(mas->node));
+       mast->l->max = mast->bn->pivot[split];
+       mast->r->min = mast->l->max + 1;
+       if (!mte_is_leaf(mas->node)) {
+               p_slot = mas_get_slot(mast->orig_l);
+               mas_set_split_parent(mast->orig_l, mast->l->node,
+                                    mast->r->node, &p_slot, split);
+               mas_set_split_parent(mast->orig_r, mast->l->node,
+                                    mast->r->node, &p_slot, split);
+       }
+}
 static inline int mas_split(struct ma_state *mas,
                            struct maple_big_node *b_node)
 {
 
        struct maple_subtree_state mast;
-       unsigned char p_slot, split = 0;
        int height = 0;
-       unsigned char mid_split;
 
        MA_STATE(l_mas, mas->tree, mas->index, mas->last);
        MA_STATE(r_mas, mas->tree, mas->index, mas->last);
@@ -2495,6 +2514,8 @@ static inline int mas_split(struct ma_state *mas,
 
        mast.l = &l_mas;
        mast.r = &r_mas;
+       mast.orig_l = &prev_l_mas;
+       mast.orig_r = &prev_r_mas;
        mast.free = &mat;
        mast.bn = b_node;
 
@@ -2506,20 +2527,7 @@ static inline int mas_split(struct ma_state *mas,
                mas_dup_state(&r_mas, mas);
                l_mas.node = mas_new_ma_node(mas, b_node);
                r_mas.node = mas_new_ma_node(mas, b_node);
-               split = mab_calc_split(b_node, &mid_split);
-               mab_mas_cp(b_node, 0, split, &l_mas);
-               mte_set_pivot(r_mas.node, 0, r_mas.max);
-               mab_mas_cp(b_node, split + 1, b_node->b_end, &r_mas);
-               mas_set_slot(&l_mas, mte_parent_slot(mas->node));
-               l_mas.max = b_node->pivot[split];
-               r_mas.min = l_mas.max + 1;
-               if (!mte_is_leaf(mas->node)) {
-                       p_slot = mas_get_slot(&prev_l_mas);
-                       mas_set_split_parent(&prev_l_mas, l_mas.node,
-                                            r_mas.node, &p_slot, split);
-                       mas_set_split_parent(&prev_r_mas, l_mas.node,
-                                            r_mas.node, &p_slot, split);
-               }
+               mast_split_data(&mast, mas);
                mast_split_fill_bnode(&mast, mas);
                mas_dup_state(&prev_l_mas, mast.l);
                mas_dup_state(&prev_r_mas, mast.r);