]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to 2152e671d8 bcachefs: Add a bit of missing repair code
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 21 Nov 2021 19:55:54 +0000 (14:55 -0500)
committerKent Overstreet <kent.overstreet@gmail.com>
Sun, 21 Nov 2021 19:55:54 +0000 (14:55 -0500)
.bcachefs_revision
libbcachefs/btree_gc.c

index 89d606721549c9aa5a5642f8ba331930b2b73fcc..4b121b1335847b9fceb37b68f544d80ed9c28b8a 100644 (file)
@@ -1 +1 @@
-70b5fb5dafe66482c0d09a37bd547f56ef645bc4
+2152e671d805a531496b649b593e0a1918069d84
index b4340df677b7ee74f2519dd2aa9b542498400553..3ec43ca563bea78d2a72961ac23b7f4b1cf12f89 100644 (file)
@@ -498,6 +498,10 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
        char buf[200];
        int ret = 0;
 
+       /*
+        * XXX
+        * use check_bucket_ref here
+        */
        bkey_for_each_ptr_decode(k->k, ptrs, p, entry) {
                struct bch_dev *ca = bch_dev_bkey_exists(c, p.ptr.dev);
                struct bucket *g = PTR_BUCKET(ca, &p.ptr, true);
@@ -553,6 +557,15 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
                        }
                }
 
+               if (fsck_err_on(gen_cmp(g->mark.gen, p.ptr.gen) > BUCKET_GC_GEN_MAX, c,
+                               "bucket %u:%zu gen %u data type %s: ptr gen %u too stale\n"
+                               "while marking %s",
+                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr), g->mark.gen,
+                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                               p.ptr.gen,
+                               (bch2_bkey_val_to_text(&PBUF(buf), c, *k), buf)))
+                       do_update = true;
+
                if (fsck_err_on(!p.ptr.cached &&
                                gen_cmp(p.ptr.gen, g->mark.gen) < 0, c,
                                "bucket %u:%zu data type %s stale dirty ptr: %u < %u\n"
@@ -644,6 +657,7 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
                                 (!g->gen_valid || gen_cmp(ptr->gen, g->mark.gen) > 0)) ||
                                (!ptr->cached &&
                                 gen_cmp(ptr->gen, g->mark.gen) < 0) ||
+                               gen_cmp(g->mark.gen, ptr->gen) > BUCKET_GC_GEN_MAX ||
                                (g->mark.data_type &&
                                 g->mark.data_type != data_type);
                        }));