]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
fix new node location
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 26 Aug 2025 15:31:50 +0000 (11:31 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 2 Oct 2025 17:28:02 +0000 (13:28 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index da10281d57c7566c47b2a145809d3de77a465c8d..a148c5315207606be9090af2873b161afbe00668 100644 (file)
@@ -2907,12 +2907,17 @@ unsigned long node_copy(struct ma_state *mas, struct maple_node *src,
        d_pivots = ma_pivots(dst, d_mt) + d_start;
        s_slots = ma_slots(src, s_mt) + start;
        s_pivots = ma_pivots(src, s_mt) + start;
-       memcpy(d_slots, s_slots, size * sizeof(void*));
+       memcpy(d_slots, s_slots, size * sizeof(void __rcu*));
        if (!ma_is_leaf(d_mt) && s_mt == maple_copy) {
                struct maple_enode *edst = mt_mk_node(dst, d_mt);
 
-               for (int i = 0; i < size; i++)
+               printk("dst %p d_slots %p %p\n", dst, d_slots, *d_slots);
+               printk("d_start %u\n", d_start);
+               for (int i = 0; i < size; i++) {
+                       printk("set slot %u parent\n", i);
+                       printk("d_slots = %p\n", d_slots[i]);
                        mas_set_parent(mas, d_slots[i], edst, i);
+               }
        }
 
        d_gaps = ma_gaps(dst, d_mt);
@@ -3073,7 +3078,7 @@ void spanning_split_dest_setup(struct maple_copy *cp, struct ma_state *mas,
 }
 
 
-void spanning_init_cp_src(struct maple_copy *cp)
+static inline void spanning_init_cp_src(struct maple_copy *cp)
 {
        cp->src[cp->s_count].node = ma_mnode_ptr(cp);
        cp->src[cp->s_count].mt = maple_copy;
@@ -3296,18 +3301,22 @@ static bool spanning_ascend(struct maple_copy *cp, struct ma_state *mas,
                        if (!mt_is_alloc(mas->tree))
                                mt = maple_range_64;
 
+                       cp->data = cp->d_count;
+                       cp->s_count = 0;
                        spanning_split_dest_setup(cp, mas, mt);
                        spanning_init_cp_src(cp);
-                       node_copy(mas, cp->src[0].node, 0, cp->d_count, cp->max, maple_copy,
+                       node_copy(mas, cp->src[0].node, 0, cp->data, cp->max, maple_copy,
                                  cp->dst[0].node, 0, mt);
                        printk("New root\n");
-                       BUG_ON(1);
+                       cp->slot[0] = mt_mk_node(cp->dst[0].node, mt);
                }
 
                printk("CONVERGED\n");
                cp->dst[0].node->parent = ma_parent_ptr(mas_tree_parent(mas));
                while (!mte_is_root(mas->node))
                        mas_ascend(mas);
+               printk("parent %p vs %p\n", cp->dst[0].node->parent, mas_mn(mas)->parent);
+               printk("cp->dst %p cp->slot %p\n", cp->dst[0].node, mte_to_node(cp->slot[0]));
                return false;
        } else if (l_wr_mas->mas->node == r_wr_mas->mas->node){
                if (cp->d_count == 1) {