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 <[email protected]>
---
 fs/bcachefs/recovery_passes.c       | 15 +++++++++++++++
 fs/bcachefs/recovery_passes_types.h |  3 ++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/fs/bcachefs/recovery_passes.c b/fs/bcachefs/recovery_passes.c
index d0b8a852efae..92e431af9ac3 100644
--- a/fs/bcachefs/recovery_passes.c
+++ b/fs/bcachefs/recovery_passes.c
@@ -51,6 +51,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;
diff --git a/fs/bcachefs/recovery_passes_types.h 
b/fs/bcachefs/recovery_passes_types.h
index e89b9c783285..4671ccf2d560 100644
--- a/fs/bcachefs/recovery_passes_types.h
+++ b/fs/bcachefs/recovery_passes_types.h
@@ -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 {
-- 
2.49.0


Reply via email to