bcachefs: Fix repair leading to replicas not marked
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 23 Apr 2021 20:18:43 +0000 (16:18 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:01 +0000 (17:09 -0400)
bch2_check_fix_ptrs() was being called after checking if the replicas
set was marked - but repair could change which replicas set needed to be
marked. Oops.

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

index a7ffd56..6983a11 100644 (file)
@@ -330,6 +330,10 @@ static int bch2_gc_mark_key(struct bch_fs *c, enum btree_id btree_id,
                BUG_ON(bch2_journal_seq_verify &&
                       k->k->version.lo > journal_cur_seq(&c->journal));
 
+               ret = bch2_check_fix_ptrs(c, btree_id, level, is_root, k);
+               if (ret)
+                       goto err;
+
                if (fsck_err_on(k->k->version.lo > atomic64_read(&c->key_version), c,
                                "key version number higher than recorded: %llu > %llu",
                                k->k->version.lo,
@@ -346,8 +350,6 @@ static int bch2_gc_mark_key(struct bch_fs *c, enum btree_id btree_id,
                                goto err;
                        }
                }
-
-               ret = bch2_check_fix_ptrs(c, btree_id, level, is_root, k);
        }
 
        ptrs = bch2_bkey_ptrs_c(*k);