]> www.infradead.org Git - users/hch/block.git/commitdiff
bcachefs: check_subvol_path() now prints subvol root inode
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 24 Sep 2024 02:32:47 +0000 (22:32 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 28 Sep 2024 02:32:23 +0000 (22:32 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fsck.c
fs/bcachefs/sb-errors_format.h

index 8f52911558a770dd753835136454c25ec6da023d..0d8b782b63fb63045f64e93aa1295fb8497f7b10 100644 (file)
@@ -2371,22 +2371,6 @@ static bool darray_u32_has(darray_u32 *d, u32 v)
        return false;
 }
 
-/*
- * We've checked that inode backpointers point to valid dirents; here, it's
- * sufficient to check that the subvolume root has a dirent:
- */
-static int subvol_has_dirent(struct btree_trans *trans, struct bkey_s_c_subvolume s)
-{
-       struct bch_inode_unpacked inode;
-       int ret = bch2_inode_find_by_inum_trans(trans,
-                               (subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
-                               &inode);
-       if (ret)
-               return ret;
-
-       return inode.bi_dir != 0;
-}
-
 static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k)
 {
        struct bch_fs *c = trans->c;
@@ -2405,14 +2389,24 @@ static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter,
 
                struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
 
-               ret = subvol_has_dirent(trans, s);
-               if (ret < 0)
+               struct bch_inode_unpacked subvol_root;
+               ret = bch2_inode_find_by_inum_trans(trans,
+                                       (subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
+                                       &subvol_root);
+               if (ret)
                        break;
 
-               if (fsck_err_on(!ret,
+               /*
+                * We've checked that inode backpointers point to valid dirents;
+                * here, it's sufficient to check that the subvolume root has a
+                * dirent:
+                */
+               if (fsck_err_on(!subvol_root.bi_dir,
                                trans, subvol_unreachable,
                                "unreachable subvolume %s",
                                (bch2_bkey_val_to_text(&buf, c, s.s_c),
+                                prt_newline(&buf),
+                                bch2_inode_unpacked_to_text(&buf, &subvol_root),
                                 buf.buf))) {
                        ret = reattach_subvol(trans, s);
                        break;
index c15c52ebf699b75bf583b775678921c59653b00b..ed5dca5e11617287b74960eb34c3e3f5294896e1 100644 (file)
@@ -271,7 +271,7 @@ enum bch_fsck_flags {
        x(subvol_children_not_set,                              256,    0)              \
        x(subvol_children_bad,                                  257,    0)              \
        x(subvol_loop,                                          258,    0)              \
-       x(subvol_unreachable,                                   259,    0)              \
+       x(subvol_unreachable,                                   259,    FSCK_AUTOFIX)   \
        x(btree_node_bkey_bad_u64s,                             260,    0)              \
        x(btree_node_topology_empty_interior_node,              261,    0)              \
        x(btree_ptr_v2_min_key_bad,                             262,    0)              \