bcachefs: btree_and_journal_iter.trans
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 22 Jan 2024 19:37:42 +0000 (14:37 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 10 Mar 2024 19:34:08 +0000 (15:34 -0400)
we now always have a btree_trans when using a btree_and_journal_iter;
prep work for adding prefetching to btree_and_journal_iter

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_journal_iter.c
fs/bcachefs/btree_journal_iter.h

index 829da0f92f0de1a379f02593cdb756a7bc0f8ed2..2caf9f5e0c358603692d0b45302611e655513524 100644 (file)
@@ -389,7 +389,7 @@ again:
        have_child = dropped_children = false;
        bch2_bkey_buf_init(&prev_k);
        bch2_bkey_buf_init(&cur_k);
-       bch2_btree_and_journal_iter_init_node_iter(&iter, c, b);
+       bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
 
        while ((k = bch2_btree_and_journal_iter_peek(&iter)).k) {
                BUG_ON(bpos_lt(k.k->p, b->data->min_key));
@@ -478,7 +478,7 @@ again:
                goto err;
 
        bch2_btree_and_journal_iter_exit(&iter);
-       bch2_btree_and_journal_iter_init_node_iter(&iter, c, b);
+       bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
 
        while ((k = bch2_btree_and_journal_iter_peek(&iter)).k) {
                bch2_bkey_buf_reassemble(&cur_k, c, k);
@@ -931,7 +931,7 @@ static int bch2_gc_btree_init_recurse(struct btree_trans *trans, struct btree *b
        struct printbuf buf = PRINTBUF;
        int ret = 0;
 
-       bch2_btree_and_journal_iter_init_node_iter(&iter, c, b);
+       bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
        bch2_bkey_buf_init(&prev);
        bch2_bkey_buf_init(&cur);
        bkey_init(&prev.k->k);
@@ -963,7 +963,7 @@ static int bch2_gc_btree_init_recurse(struct btree_trans *trans, struct btree *b
 
        if (b->c.level > target_depth) {
                bch2_btree_and_journal_iter_exit(&iter);
-               bch2_btree_and_journal_iter_init_node_iter(&iter, c, b);
+               bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
 
                while ((k = bch2_btree_and_journal_iter_peek(&iter)).k) {
                        struct btree *child;
index e6e7649dec797fac2baa66c245cfbceaa834cd3e..8f185a98f96f501a99fcc2123a0864d1d4a91e6f 100644 (file)
@@ -891,7 +891,7 @@ static noinline int btree_node_iter_and_journal_peek(struct btree_trans *trans,
        struct bkey_s_c k;
        int ret = 0;
 
-       __bch2_btree_and_journal_iter_init_node_iter(&jiter, c, l->b, l->iter, path->pos);
+       __bch2_btree_and_journal_iter_init_node_iter(trans, &jiter, l->b, l->iter, path->pos);
 
        k = bch2_btree_and_journal_iter_peek(&jiter);
 
index 719a94a84950b7fe2d179b4860c2eed727044417..fa907293ba433611942ea6cf4d7f9f58b717aa6c 100644 (file)
@@ -376,17 +376,18 @@ void bch2_btree_and_journal_iter_exit(struct btree_and_journal_iter *iter)
        bch2_journal_iter_exit(&iter->journal);
 }
 
-void __bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *iter,
-                                                 struct bch_fs *c,
+void __bch2_btree_and_journal_iter_init_node_iter(struct btree_trans *trans,
+                                                 struct btree_and_journal_iter *iter,
                                                  struct btree *b,
                                                  struct btree_node_iter node_iter,
                                                  struct bpos pos)
 {
        memset(iter, 0, sizeof(*iter));
 
+       iter->trans = trans;
        iter->b = b;
        iter->node_iter = node_iter;
-       bch2_journal_iter_init(c, &iter->journal, b->c.btree_id, b->c.level, pos);
+       bch2_journal_iter_init(trans->c, &iter->journal, b->c.btree_id, b->c.level, pos);
        INIT_LIST_HEAD(&iter->journal.list);
        iter->pos = b->data->min_key;
        iter->at_end = false;
@@ -396,15 +397,15 @@ void __bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter
  * this version is used by btree_gc before filesystem has gone RW and
  * multithreaded, so uses the journal_iters list:
  */
-void bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *iter,
-                                               struct bch_fs *c,
+void bch2_btree_and_journal_iter_init_node_iter(struct btree_trans *trans,
+                                               struct btree_and_journal_iter *iter,
                                                struct btree *b)
 {
        struct btree_node_iter node_iter;
 
        bch2_btree_node_iter_init_from_start(&node_iter, b);
-       __bch2_btree_and_journal_iter_init_node_iter(iter, c, b, node_iter, b->data->min_key);
-       list_add(&iter->journal.list, &c->journal_iters);
+       __bch2_btree_and_journal_iter_init_node_iter(trans, iter, b, node_iter, b->data->min_key);
+       list_add(&iter->journal.list, &trans->c->journal_iters);
 }
 
 /* sort and dedup all keys in the journal: */
index 8ca4c100b2e3e413d7adbb8dd5599d9f42de6d30..1793cf89148b01353175b1e3f1815af4e76bb0f6 100644 (file)
@@ -15,6 +15,7 @@ struct journal_iter {
  */
 
 struct btree_and_journal_iter {
+       struct btree_trans      *trans;
        struct btree            *b;
        struct btree_node_iter  node_iter;
        struct bkey             unpacked;
@@ -29,6 +30,9 @@ struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *, enum btree_id,
 struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
                                           unsigned, struct bpos);
 
+int bch2_btree_and_journal_iter_prefetch(struct btree_trans *, struct btree_path *,
+                                        struct btree_and_journal_iter *);
+
 int bch2_journal_key_insert_take(struct bch_fs *, enum btree_id,
                                 unsigned, struct bkey_i *);
 int bch2_journal_key_insert(struct bch_fs *, enum btree_id,
@@ -42,12 +46,11 @@ void bch2_btree_and_journal_iter_advance(struct btree_and_journal_iter *);
 struct bkey_s_c bch2_btree_and_journal_iter_peek(struct btree_and_journal_iter *);
 
 void bch2_btree_and_journal_iter_exit(struct btree_and_journal_iter *);
-void __bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *,
-                               struct bch_fs *, struct btree *,
+void __bch2_btree_and_journal_iter_init_node_iter(struct btree_trans *,
+                               struct btree_and_journal_iter *, struct btree *,
                                struct btree_node_iter, struct bpos);
-void bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *,
-                                               struct bch_fs *,
-                                               struct btree *);
+void bch2_btree_and_journal_iter_init_node_iter(struct btree_trans *,
+                               struct btree_and_journal_iter *, struct btree *);
 
 void bch2_journal_keys_put(struct bch_fs *);