bcachefs: Traverse iterator in journal replay
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 9 Mar 2020 20:15:54 +0000 (16:15 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:36 +0000 (17:08 -0400)
This fixes a bug where we end up spinning in journal replay - in theory
this shouldn't be necessary though, transaction reset should be
re-traversing all iterators.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/recovery.c

index 3b9c20cf389abcb53793350b841b5622e11ff309..712a6b1fd968589548b456513337d22fa4f8a8b9 100644 (file)
@@ -417,15 +417,17 @@ static int __bch2_journal_replay_key(struct btree_trans *trans,
                                     enum btree_id id, struct bkey_i *k)
 {
        struct btree_iter *iter;
+       int ret;
 
        iter = bch2_trans_get_iter(trans, id, bkey_start_pos(&k->k),
                                   BTREE_ITER_INTENT);
        if (IS_ERR(iter))
                return PTR_ERR(iter);
 
-       bch2_trans_update(trans, iter, k, BTREE_TRIGGER_NORUN);
+       ret   = bch2_btree_iter_traverse(iter) ?:
+               bch2_trans_update(trans, iter, k, BTREE_TRIGGER_NORUN);
        bch2_trans_iter_put(trans, iter);
-       return 0;
+       return ret;
 }
 
 static int bch2_journal_replay_key(struct bch_fs *c, enum btree_id id,