bcachefs: do reflink_p repair from BTREE_TRIGGER_check_repair
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 7 Apr 2024 23:47:31 +0000 (19:47 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:20 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/reflink.c

index a0cf5d97513f10522e6682aa67aab437da484913..a8a761d59a5da9bb4431f5dea72971ab995fd9f4 100644 (file)
@@ -164,10 +164,13 @@ static s64 gc_trigger_reflink_p_segment(struct btree_trans *trans,
 
        BUG_ON((s64) r->refcount + add < 0);
 
-       r->refcount += add;
+       if (flags & BTREE_TRIGGER_gc)
+               r->refcount += add;
        *idx = r->offset;
        return 0;
 not_found:
+       BUG_ON(!(flags & BTREE_TRIGGER_check_repair));
+
        if (fsck_err(c, reflink_p_to_missing_reflink_v,
                     "pointer to missing indirect extent\n"
                     "  %s\n"
@@ -216,7 +219,7 @@ static int __trigger_reflink_p(struct btree_trans *trans,
                        ret = trans_trigger_reflink_p_segment(trans, p, &idx, flags);
        }
 
-       if (flags & BTREE_TRIGGER_gc) {
+       if (flags & (BTREE_TRIGGER_check_repair|BTREE_TRIGGER_gc)) {
                size_t l = 0, r = c->reflink_gc_nr;
 
                while (l < r) {