bcachefs: Add a recovery pass for making sure root inode is readable

If the root inode/subvolume is unreadable we can repair automatically -
but only if we're still in recovery, so that we can rewind to the
appropriate recovery pass.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2025-04-15 19:21:52 -04:00
parent bdad8962c9
commit d12bd41018
2 changed files with 17 additions and 1 deletions

View File

@ -52,6 +52,21 @@ static int bch2_set_may_go_rw(struct bch_fs *c)
return 0;
}
/*
* Make sure root inode is readable while we're still in recovery and can rewind
* for repair:
*/
static int bch2_lookup_root_inode(struct bch_fs *c)
{
subvol_inum inum = BCACHEFS_ROOT_SUBVOL_INUM;
struct bch_inode_unpacked inode_u;
struct bch_subvolume subvol;
return bch2_trans_do(c,
bch2_subvolume_get(trans, inum.subvol, true, &subvol) ?:
bch2_inode_find_by_inum_trans(trans, inum, &inode_u));
}
struct recovery_pass_fn {
int (*fn)(struct bch_fs *);
unsigned when;

View File

@ -60,7 +60,8 @@
x(resume_logged_ops, 23, PASS_ALWAYS) \
x(delete_dead_inodes, 32, PASS_ALWAYS) \
x(fix_reflink_p, 33, 0) \
x(set_fs_needs_rebalance, 34, 0)
x(set_fs_needs_rebalance, 34, 0) \
x(lookup_root_inode, 42, PASS_ALWAYS|PASS_SILENT)
/* We normally enumerate recovery passes in the order we run them: */
enum bch_recovery_pass {