]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_update_interior.h
New upstream snapshot
[bcachefs-tools-debian] / libbcachefs / btree_update_interior.h
index 7668225e72c66b386aabdb8ab6778497094c27c7..f2925b0d7f17eacfd7773cc4a7e57b3180cc4024 100644 (file)
@@ -47,8 +47,8 @@ struct btree_update {
                BTREE_INTERIOR_UPDATING_AS,
        } mode;
 
-       unsigned                        must_rewrite:1;
        unsigned                        nodes_written:1;
+       unsigned                        took_gc_lock:1;
 
        enum btree_id                   btree_id;
 
@@ -121,8 +121,7 @@ struct btree *__bch2_btree_node_alloc_replacement(struct btree_update *,
 
 void bch2_btree_update_done(struct btree_update *);
 struct btree_update *
-bch2_btree_update_start(struct btree_trans *, enum btree_id, unsigned,
-                       unsigned, struct closure *);
+bch2_btree_update_start(struct btree_iter *, unsigned, unsigned, unsigned);
 
 void bch2_btree_interior_update_will_free_node(struct btree_update *,
                                               struct btree *);
@@ -133,10 +132,10 @@ void bch2_btree_insert_node(struct btree_update *, struct btree *,
                            unsigned);
 int bch2_btree_split_leaf(struct bch_fs *, struct btree_iter *, unsigned);
 
-void __bch2_foreground_maybe_merge(struct bch_fs *, struct btree_iter *,
-                                  unsigned, unsigned, enum btree_node_sibling);
+int __bch2_foreground_maybe_merge(struct bch_fs *, struct btree_iter *,
+                                 unsigned, unsigned, enum btree_node_sibling);
 
-static inline void bch2_foreground_maybe_merge_sibling(struct bch_fs *c,
+static inline int bch2_foreground_maybe_merge_sibling(struct bch_fs *c,
                                        struct btree_iter *iter,
                                        unsigned level, unsigned flags,
                                        enum btree_node_sibling sib)
@@ -144,27 +143,27 @@ static inline void bch2_foreground_maybe_merge_sibling(struct bch_fs *c,
        struct btree *b;
 
        if (iter->uptodate >= BTREE_ITER_NEED_TRAVERSE)
-               return;
+               return 0;
 
        if (!bch2_btree_node_relock(iter, level))
-               return;
+               return 0;
 
        b = iter->l[level].b;
        if (b->sib_u64s[sib] > c->btree_foreground_merge_threshold)
-               return;
+               return 0;
 
-       __bch2_foreground_maybe_merge(c, iter, level, flags, sib);
+       return __bch2_foreground_maybe_merge(c, iter, level, flags, sib);
 }
 
-static inline void bch2_foreground_maybe_merge(struct bch_fs *c,
+static inline int bch2_foreground_maybe_merge(struct bch_fs *c,
                                               struct btree_iter *iter,
                                               unsigned level,
                                               unsigned flags)
 {
-       bch2_foreground_maybe_merge_sibling(c, iter, level, flags,
-                                           btree_prev_sib);
-       bch2_foreground_maybe_merge_sibling(c, iter, level, flags,
-                                           btree_next_sib);
+       return  bch2_foreground_maybe_merge_sibling(c, iter, level, flags,
+                                                   btree_prev_sib) ?:
+               bch2_foreground_maybe_merge_sibling(c, iter, level, flags,
+                                                   btree_next_sib);
 }
 
 void bch2_btree_set_root_for_read(struct bch_fs *, struct btree *);
@@ -237,6 +236,9 @@ static inline ssize_t __bch_btree_u64s_remaining(struct bch_fs *c,
                b->whiteout_u64s;
        ssize_t total = c->opts.btree_node_size << 6;
 
+       /* Always leave one extra u64 for bch2_varint_decode: */
+       used++;
+
        return total - used;
 }