diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-06-22 23:06:16 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-07-12 08:52:52 -0400 |
commit | 089d9940b0316df87cc35d1cd6d8aa6cfb3105ab (patch) | |
tree | 58be7e1aecef8b380910dd4c3de342e50c5a731a | |
parent | da90cd5a0316d5546dc507c76de0f60b62090fd1 (diff) |
bcachefs: We can handle missing btree roots for all alloc btrees
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@gmail.com>
-rw-r--r-- | fs/bcachefs/recovery.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 63e8c1c3d940..eea025a83b43 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -919,6 +919,19 @@ 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_backpointers: + 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; @@ -930,14 +943,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]); @@ -947,7 +960,8 @@ 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]); |