]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: use store type in mas_wr_store_entry()
authorSidhartha Kumar <sidhartha.kumar@oracle.com>
Thu, 18 Jan 2024 19:40:05 +0000 (11:40 -0800)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Sat, 20 Apr 2024 01:40:09 +0000 (21:40 -0400)
When storing an entry, we can read the store type that was set from a
previous partial walk of the tree. Now that the type of store is known,
select the correct write helper function to use to complete the store.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
lib/maple_tree.c

index 2512d2d7665ebd496d37debacb5447e5966070b9..59fa7daf5b3918292aa58beb5a1529b6483f9d5f 100644 (file)
@@ -4208,27 +4208,42 @@ slow_path:
 static inline void *mas_wr_store_entry(struct ma_wr_state *wr_mas)
 {
        struct ma_state *mas = wr_mas->mas;
+       unsigned char new_end = mas_wr_new_end(wr_mas);
 
-       wr_mas->content = mas_start(mas);
-       if (mas_is_none(mas) || mas_is_ptr(mas)) {
+       switch (mas->store_type) {
+       case wr_invalid:
+               MT_BUG_ON(mas->tree, 1);
+               return NULL;
+       case wr_new_root:
+               mas_new_root(mas, wr_mas->entry);
+               break;
+       case wr_store_root:
                mas_store_root(mas, wr_mas->entry);
-               return wr_mas->content;
-       }
-
-       if (unlikely(!mas_wr_walk(wr_mas))) {
+               break;
+       case wr_exact_fit:
+               rcu_assign_pointer(wr_mas->slots[mas->offset], wr_mas->entry);
+               if (!!wr_mas->entry ^ !!wr_mas->content)
+                       mas_update_gap(mas);
+               break;
+       case wr_append:
+               mas_wr_append(wr_mas, new_end);
+               break;
+       case wr_slot_store:
+               mas_wr_slot_store(wr_mas);
+               break;
+       case wr_node_store:
+               mas_wr_node_store(wr_mas, new_end);
+               break;
+       case wr_spanning_store:
                mas_wr_spanning_store(wr_mas);
-               return wr_mas->content;
-       }
-
-       /* At this point, we are at the leaf node that needs to be altered. */
-       mas_wr_end_piv(wr_mas);
-       /* New root for a single pointer */
-       if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
-               mas_new_root(mas, wr_mas->entry);
-               return wr_mas->content;
+               break;
+       case wr_split_store:
+       case wr_rebalance:
+       case wr_bnode:
+               mas_wr_bnode(wr_mas);
+               break;
        }
 
-       mas_wr_modify(wr_mas);
        return wr_mas->content;
 }