]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
bcachefs: Fix marking reflink pointers to missing indirect extents
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 7 Feb 2025 03:28:41 +0000 (22:28 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 7 Feb 2025 19:49:47 +0000 (14:49 -0500)
reflink pointers to missing indirect extents aren't deleted, they just
have an error bit set - in case the indirect extent somehow reappears.

fsck/mark and sweep thus needs to ignore these errors.

Also, they can be marked AUTOFIX now.

Reported-by: Roland Vet <vet.roland@protonmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/reflink.c
fs/bcachefs/sb-errors_format.h

index 93ba4f4e47cae495d360f060b25fccedd056eaeb..376fd0a6e868cc75e8d55ee4b633a6b0bd70ffd6 100644 (file)
@@ -381,6 +381,8 @@ static s64 gc_trigger_reflink_p_segment(struct btree_trans *trans,
 not_found:
        if (flags & BTREE_TRIGGER_check_repair) {
                ret = bch2_indirect_extent_missing_error(trans, p, *idx, next_idx, false);
+               if (ret == -BCH_ERR_missing_indirect_extent)
+                       ret = 0;
                if (ret)
                        goto err;
        }
index ea0a18364751dd1e211c7a924e4372a741fe5149..b86ec013d7d703ea34b8c3e0fd6f321545bc449b 100644 (file)
@@ -180,9 +180,9 @@ enum bch_fsck_flags {
        x(ptr_crc_nonce_mismatch,                               162,    0)              \
        x(ptr_stripe_redundant,                                 163,    0)              \
        x(reservation_key_nr_replicas_invalid,                  164,    0)              \
-       x(reflink_v_refcount_wrong,                             165,    0)              \
+       x(reflink_v_refcount_wrong,                             165,    FSCK_AUTOFIX)   \
        x(reflink_v_pos_bad,                                    292,    0)              \
-       x(reflink_p_to_missing_reflink_v,                       166,    0)              \
+       x(reflink_p_to_missing_reflink_v,                       166,    FSCK_AUTOFIX)   \
        x(reflink_refcount_underflow,                           293,    0)              \
        x(stripe_pos_bad,                                       167,    0)              \
        x(stripe_val_size_bad,                                  168,    0)              \