]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fsck.c
Update bcachefs sources to 18686af684 bcachefs: Inode backpointers
[bcachefs-tools-debian] / libbcachefs / fsck.c
index 9dc162f2e1759d0c9569c43213f259d4befae287..62788ae15eff3f9cf5078afaa93f9bd24f89f2db 100644 (file)
@@ -675,6 +675,39 @@ retry:
                        continue;
                }
 
+               if (!target.bi_nlink &&
+                   !(target.bi_flags & BCH_INODE_BACKPTR_UNTRUSTED) &&
+                   (target.bi_dir != k.k->p.inode ||
+                    target.bi_dir_offset != k.k->p.offset) &&
+                   (fsck_err_on(c->sb.version >= bcachefs_metadata_version_inode_backpointers, c,
+                                "inode %llu has wrong backpointer:\n"
+                                "got       %llu:%llu\n"
+                                "should be %llu:%llu",
+                                d_inum,
+                                target.bi_dir,
+                                target.bi_dir_offset,
+                                k.k->p.inode,
+                                k.k->p.offset) ||
+                    c->opts.version_upgrade)) {
+                       struct bkey_inode_buf p;
+
+                       target.bi_dir           = k.k->p.inode;
+                       target.bi_dir_offset    = k.k->p.offset;
+                       bch2_trans_unlock(&trans);
+
+                       bch2_inode_pack(c, &p, &target);
+
+                       ret = bch2_btree_insert(c, BTREE_ID_inodes,
+                                               &p.inode.k_i, NULL, NULL,
+                                               BTREE_INSERT_NOFAIL|
+                                               BTREE_INSERT_LAZY_RW);
+                       if (ret) {
+                               bch_err(c, "error in fsck: error %i updating inode", ret);
+                               goto err;
+                       }
+                       continue;
+               }
+
                if (fsck_err_on(have_target &&
                                d.v->d_type !=
                                mode_to_type(target.bi_mode), c,
@@ -1314,6 +1347,16 @@ static int check_inode(struct btree_trans *trans,
                do_update = true;
        }
 
+       if (!S_ISDIR(u.bi_mode) &&
+           u.bi_nlink &&
+           !(u.bi_flags & BCH_INODE_BACKPTR_UNTRUSTED) &&
+           (fsck_err_on(c->sb.version >= bcachefs_metadata_version_inode_backpointers, c,
+                        "inode missing BCH_INODE_BACKPTR_UNTRUSTED flags") ||
+            c->opts.version_upgrade)) {
+               u.bi_flags |= BCH_INODE_BACKPTR_UNTRUSTED;
+               do_update = true;
+       }
+
        if (do_update) {
                struct bkey_inode_buf p;