bcachefs: Ignore empty btree root journal entries
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 27 Nov 2024 06:03:41 +0000 (01:03 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:20 +0000 (01:36 -0500)
There's no reason to treat them as errors: just ignore them, and go with
a previous btree root if we had one.

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

index 547c78a323f734272e25bdedda4a9cd886e9cd60..727e894762f544eebeb7c5373536e874cff58526 100644 (file)
@@ -442,7 +442,9 @@ static int journal_replay_entry_early(struct bch_fs *c,
 
        switch (entry->type) {
        case BCH_JSET_ENTRY_btree_root: {
-               struct btree_root *r;
+
+               if (unlikely(!entry->u64s))
+                       return 0;
 
                if (fsck_err_on(entry->btree_id >= BTREE_ID_NR_MAX,
                                c, invalid_btree_id,
@@ -456,15 +458,11 @@ static int journal_replay_entry_early(struct bch_fs *c,
                                return ret;
                }
 
-               r = bch2_btree_id_root(c, entry->btree_id);
+               struct btree_root *r = bch2_btree_id_root(c, entry->btree_id);
 
-               if (entry->u64s) {
-                       r->level = entry->level;
-                       bkey_copy(&r->key, (struct bkey_i *) entry->start);
-                       r->error = 0;
-               } else {
-                       r->error = -BCH_ERR_btree_node_read_error;
-               }
+               r->level = entry->level;
+               bkey_copy(&r->key, (struct bkey_i *) entry->start);
+               r->error = 0;
                r->alive = true;
                break;
        }