]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
cp_data_write: simplify
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 16 Sep 2025 19:50:21 +0000 (15:50 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 16 Sep 2025 19:50:21 +0000 (15:50 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index a7e121109ba3406b026eb499b6a6f16f294b5e1c..f84c8cef9b063f91e5efe956d41d7afcea08612a 100644 (file)
@@ -3229,12 +3229,14 @@ void cp_data_write(struct maple_copy *cp, struct ma_state *mas)
        struct maple_node *dst, *src;
        unsigned char s, d;
        unsigned char dst_offset;
-       unsigned char data, data_offset;
+       unsigned char data_offset;
        unsigned char src_end, s_offset;
-       unsigned char split, next_node, size;
+       unsigned char split;
        unsigned long s_max, d_max;
+       unsigned char dst_size;
        enum maple_type s_mt, d_mt;
 
+       data_offset = 0;
        s = d = 0;
        /* Readability help */
        src = cp->src[s].node;
@@ -3245,31 +3247,27 @@ void cp_data_write(struct maple_copy *cp, struct ma_state *mas)
        s_max = cp->src[s].max;
        s_mt = cp->src[s].mt;
        d_mt = cp->dst[d].mt;
-       data = cp->data;
-
-       dst_offset = 0;
-       data_offset = 0;
-       next_node = split;
-       /*
-        * size (and split, and next_node will be 1 indexed while
-        * src start/end dst start/end are 0 indexed
-        */
+       dst_size = split + 1;
        do {
-               do {
-                       size = next_node - data_offset + 1;
-                       /* Fill the destination */
-                       if (src_end - s_offset + 1 < size)
-                               size = src_end - s_offset + 1;
+               dst_offset = 0;
+               d_max = 0;
+               dst = cp->dst[d].node;
+               d_mt = cp->dst[d].mt;
+               dst_size = split;
+
+               while (dst_size) {
+                       unsigned char size;
 
-                       if (split - dst_offset + 1 < size)
-                               size = split - dst_offset + 1;
+                       if (src_end - s_offset + 1 < dst_size)
+                               size = src_end - s_offset + 1;
+                       else
+                               size = dst_size;
 
                        d_max = node_copy(mas, src, s_offset, size, s_max, s_mt,
                                          dst, dst_offset, d_mt);
-                       data_offset += size;
+
                        dst_offset += size;
                        s_offset += size;
-
                        if (s_offset > src_end) {
                                /* This source is exhausted */
                                s++;
@@ -3278,7 +3276,6 @@ void cp_data_write(struct maple_copy *cp, struct ma_state *mas)
                                        node_finalise(dst, d_mt, dst_offset);
                                        return;
                                }
-                               d_max = s_max;
                                /* Reset local src */
                                src = cp->src[s].node;
                                s_offset = cp->src[s].start;
@@ -3286,11 +3283,10 @@ void cp_data_write(struct maple_copy *cp, struct ma_state *mas)
                                s_max = cp->src[s].max;
                                s_mt = cp->src[s].mt;
                        }
-               } while (data_offset <= next_node);
 
-               next_node *= 2;
-               if (next_node > data + 1)
-                       next_node = data + 1;
+                       dst_size -= size;
+                       data_offset += size;
+               }
 
                split = cp->split;
                cp->dst[d].max = d_max;
@@ -3308,23 +3304,21 @@ void cp_data_write(struct maple_copy *cp, struct ma_state *mas)
                                s_offset--;
                        }
                        /* Set dst max and clear pivot */
-                       next_node++;
                        split++;
                        data_offset--;
                        dst_offset--;
                        cp->dst[d].max = ma_pivots(dst, d_mt)[dst_offset - 1];
                }
+
                node_finalise(dst, d_mt, dst_offset);
                if (d >= cp->d_count) {
-                       WARN_ON(data_offset < data);
+                       WARN_ON(data_offset < cp->data);
                        return;
                }
-               /* Reset local dst */
+
+               /* Next dst */
                ++d;
-               dst = cp->dst[d].node;
-               d_mt = cp->dst[d].mt;
-               dst_offset = 0;
-       } while (data_offset <= data);
+       } while (data_offset <= cp->data);
 }