]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
fix end piv extend mess
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 27 May 2025 20:13:36 +0000 (16:13 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 27 May 2025 20:13:36 +0000 (16:13 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index cb1dc601f470c0ca6e85f72575f2be13b1057afe..a24847a677ef034e1c68694b28ddc2f23c94ca0d 100644 (file)
@@ -5031,37 +5031,46 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
        r_mas = *mas;
        r_mas.index = r_mas.last;
        mas_wr_walk_index(&r_wr_mas);
+       mas_wr_end_piv(&r_wr_mas);
+       printk("end piv is %lu\n", r_wr_mas.end_piv);
        if (!wr_mas->entry) {
-               printk("Check next range for null from %p[%u]\n", r_mas.node, r_mas.offset);
-               if (mas_next_range(&r_mas, ULONG_MAX)) {
-                       printk("next range is not null\n");
-                       mas_prev_range(&r_mas, 0);
-               } else {
-                       printk("next range IS null %p[%u]\n", r_mas.node, r_mas.offset);
-                       r_wr_mas.offset_end = r_mas.offset;
-                       if (r_wr_mas.node != mte_to_node(r_mas.node)) {
-                               printk("new node\n");
-                               r_wr_mas.node = mte_to_node(r_mas.node);
-                               r_wr_mas.type = mte_node_type(r_mas.node);
-                               r_wr_mas.slots = ma_slots(r_wr_mas.node, r_wr_mas.type);
-                               r_wr_mas.pivots = ma_pivots(r_wr_mas.node, r_wr_mas.type);
-                       }
-                       if (r_wr_mas.offset_end == r_mas.end) {
-                               r_mas.last = r_mas.max;
+               printk("extend end null maybe\n");
+               if (!r_wr_mas.slots[r_wr_mas.offset_end]) {
+                       r_mas.last = r_wr_mas.end_piv;
+               } else if (r_wr_mas.end_piv != ULONG_MAX) {
+                       printk("Check next range for null from %p[%u]\n", r_mas.node, r_mas.offset);
+                       if (mas_next_range(&r_mas, ULONG_MAX)) {
+                               printk("next range is not null\n");
+                               mas_prev_range(&r_mas, 0);
                        } else {
-                               r_mas.last = r_wr_mas.pivots[r_wr_mas.offset_end];
+                               printk("next range IS null %p[%u]\n", r_mas.node, r_mas.offset);
+                               r_wr_mas.offset_end = r_mas.offset;
+                               if (r_wr_mas.node != mte_to_node(r_mas.node)) {
+                                       printk("new node\n");
+                                       r_wr_mas.node = mte_to_node(r_mas.node);
+                                       r_wr_mas.type = mte_node_type(r_mas.node);
+                                       r_wr_mas.slots = ma_slots(r_wr_mas.node, r_wr_mas.type);
+                                       r_wr_mas.pivots = ma_pivots(r_wr_mas.node, r_wr_mas.type);
+                               }
+                               if (r_wr_mas.offset_end == r_mas.end) {
+                                       r_mas.last = r_mas.max;
+                               } else {
+                                       r_mas.last = r_wr_mas.pivots[r_wr_mas.offset_end];
+                               }
                        }
                }
        }
        r_mas.index = r_mas.min;
        r_mas.offset = 0;
-       mas_wr_end_piv(&r_wr_mas);
 
        /* Set up left side. */
        mas_wr_walk_index(wr_mas);
        mas_wr_extend_null(wr_mas);
-       if (unlikely(!mas->index && r_mas.last == ULONG_MAX))
+       printk("index %lu last %lu\n", mas->index, r_mas.last);
+       if (unlikely(!mas->index && r_mas.last == ULONG_MAX)) {
+               mas->last = ULONG_MAX;
                return mas_new_root(mas, wr_mas->entry);
+       }
 
        printk("\nwr_mas min %lu write covers %u - %u\n", mas->min, mas->offset, wr_mas->offset_end);