bcachefs: We can handle missing btree roots for all alloc btrees
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 23 Jun 2022 03:06:16 +0000 (23:06 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:36 +0000 (17:09 -0400)
We can rebuild alloc info if these btree roots are missing - no need to
bail out and say the filesystem is unrecoverable

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

index b7598e26c683ff7a86e475a31ebdbb1bf92c0f35..7fb470e2e7f3da120b4dd5d882a4ea4df5999739 100644 (file)
@@ -924,6 +924,18 @@ fsck_err:
        return ERR_PTR(ret);
 }
 
+static bool btree_id_is_alloc(enum btree_id id)
+{
+       switch (id) {
+       case BTREE_ID_alloc:
+       case BTREE_ID_need_discard:
+       case BTREE_ID_freespace:
+               return true;
+       default:
+               return false;
+       }
+}
+
 static int read_btree_roots(struct bch_fs *c)
 {
        unsigned i;
@@ -935,14 +947,14 @@ static int read_btree_roots(struct bch_fs *c)
                if (!r->alive)
                        continue;
 
-               if (i == BTREE_ID_alloc &&
+               if (btree_id_is_alloc(i) &&
                    c->opts.reconstruct_alloc) {
                        c->sb.compat &= ~(1ULL << BCH_COMPAT_alloc_info);
                        continue;
                }
 
                if (r->error) {
-                       __fsck_err(c, i == BTREE_ID_alloc
+                       __fsck_err(c, btree_id_is_alloc(i)
                                   ? FSCK_CAN_IGNORE : 0,
                                   "invalid btree root %s",
                                   bch2_btree_ids[i]);
@@ -952,11 +964,12 @@ static int read_btree_roots(struct bch_fs *c)
 
                ret = bch2_btree_root_read(c, i, &r->key, r->level);
                if (ret) {
-                       __fsck_err(c, i == BTREE_ID_alloc
+                       __fsck_err(c,
+                                  btree_id_is_alloc(i)
                                   ? FSCK_CAN_IGNORE : 0,
                                   "error reading btree root %s",
                                   bch2_btree_ids[i]);
-                       if (i == BTREE_ID_alloc)
+                       if (btree_id_is_alloc(i))
                                c->sb.compat &= ~(1ULL << BCH_COMPAT_alloc_info);
                }
        }
@@ -1192,6 +1205,9 @@ use_clean:
        if (ret)
                goto err;
 
+       if (c->opts.reconstruct_alloc)
+               bch2_journal_log_msg(&c->journal, "dropping alloc info");
+
        /*
         * Skip past versions that might have possibly been used (as nonces),
         * but hadn't had their pointers written: