]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: Add missing snapshots_seen_add_inorder()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 21 Jul 2025 18:25:21 +0000 (14:25 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 25 Jul 2025 02:56:37 +0000 (22:56 -0400)
This fixes an infinite loop when repairing "extent past end of inode",
when the extent is an older snapshot than the inode that needs repair.

Without the snaphsots_seen_add_inorder() we keep trying to delete the
same extent, even though it's no longer visible in the inode's snapshot.

Fixes: 63d6e9311999 ("bcachefs: bch2_fpunch_snapshot()")
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fsck.c

index 856eb2b4189683377d8e8a6cd891d4b7d100f954..15c1e890d299b21ce3fd29e4223d12aa5415248b 100644 (file)
@@ -1920,11 +1920,12 @@ static int check_extent(struct btree_trans *trans, struct btree_iter *iter,
                                        "extent type past end of inode %llu:%u, i_size %llu\n%s",
                                        i->inode.bi_inum, i->inode.bi_snapshot, i->inode.bi_size,
                                        (bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
-                               ret = bch2_fpunch_snapshot(trans,
-                                                          SPOS(i->inode.bi_inum,
-                                                               last_block,
-                                                               i->inode.bi_snapshot),
-                                                          POS(i->inode.bi_inum, U64_MAX));
+                               ret =   snapshots_seen_add_inorder(c, s, i->inode.bi_snapshot) ?:
+                                       bch2_fpunch_snapshot(trans,
+                                                            SPOS(i->inode.bi_inum,
+                                                                 last_block,
+                                                                 i->inode.bi_snapshot),
+                                                            POS(i->inode.bi_inum, U64_MAX));
                                if (ret)
                                        goto err;