bcachefs: Fix journal_iter list corruption
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 28 Nov 2024 20:10:24 +0000 (15:10 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:20 +0000 (01:36 -0500)
Fix exiting an iterator that wasn't initialized.

Reported-by: syzbot+2f7c2225ed8a5cb24af1@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_interior.c

index 56a70e95ef9a41d887546180605f98b7e9d9ab39..5eabd532e388cb696095bdcac156e748a92588dd 100644 (file)
@@ -58,6 +58,10 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
               !bpos_eq(bkey_i_to_btree_ptr_v2(&b->key)->v.min_key,
                        b->data->min_key));
 
+       bch2_bkey_buf_init(&prev);
+       bkey_init(&prev.k->k);
+       bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
+
        if (b == btree_node_root(c, b)) {
                if (!bpos_eq(b->data->min_key, POS_MIN)) {
                        printbuf_reset(&buf);
@@ -77,11 +81,7 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
        }
 
        if (!b->c.level)
-               return 0;
-
-       bch2_bkey_buf_init(&prev);
-       bkey_init(&prev.k->k);
-       bch2_btree_and_journal_iter_init_node_iter(trans, &iter, b);
+               goto out;
 
        while ((k = bch2_btree_and_journal_iter_peek(&iter)).k) {
                if (k.k->type != KEY_TYPE_btree_ptr_v2)