bcachefs: fsck: Fix remove_backpointer() for subvol roots
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 16 Jun 2025 18:15:28 +0000 (14:15 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 16 Jun 2025 23:04:54 +0000 (19:04 -0400)
The dirent will be in a different snapshot if the inode is a subvolume
root.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fsck.c

index 0d87aa9b4f2314a85e4fa71f0876d727662d942b..a3f73e7a21138ff5e9f684a45fce55604cf718b5 100644 (file)
@@ -493,10 +493,18 @@ static int remove_backpointer(struct btree_trans *trans,
        if (!inode->bi_dir)
                return 0;
 
+       u32 snapshot = inode->bi_snapshot;
+
+       if (inode->bi_parent_subvol) {
+               int ret = bch2_subvolume_get_snapshot(trans, inode->bi_parent_subvol, &snapshot);
+               if (ret)
+                       return ret;
+       }
+
        struct bch_fs *c = trans->c;
        struct btree_iter iter;
        struct bkey_s_c_dirent d = dirent_get_by_pos(trans, &iter,
-                                    SPOS(inode->bi_dir, inode->bi_dir_offset, inode->bi_snapshot));
+                                    SPOS(inode->bi_dir, inode->bi_dir_offset, snapshot));
        int ret = bkey_err(d) ?:
                  dirent_points_to_inode(c, d, inode) ?:
                  bch2_fsck_remove_dirent(trans, d.k->p);