]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to 4114ced1db bcachefs: Fix allocator shutdown error message
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 1 Oct 2021 14:10:55 +0000 (10:10 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Fri, 1 Oct 2021 14:10:55 +0000 (10:10 -0400)
.bcachefs_revision
libbcachefs/alloc_background.c
libbcachefs/btree_gc.c

index 2207358887f7725fae9b5450cf7407f6e46f8584..f8ad12e76001c3cb1614a28ef0903a9fd7451c52 100644 (file)
@@ -1 +1 @@
-0762d9c2948e5574944684a625524545640bf981
+4114ced1db465b8f4e7f4d6a78aa11416a9ab5d9
index 87fa92408f93ec6979e7fccdb4b1467703edccc5..d35bd849bf6878dfe37ca781f7704bc2fb74e465 100644 (file)
@@ -857,10 +857,10 @@ static int bch2_invalidate_buckets(struct bch_fs *c, struct bch_dev *ca)
        /* If we used NOWAIT, don't return the error: */
        if (!fifo_empty(&ca->free_inc))
                ret = 0;
-       if (ret) {
+       if (ret < 0)
                bch_err(ca, "error invalidating buckets: %i", ret);
+       if (ret)
                return ret;
-       }
 
        if (journal_seq)
                ret = bch2_journal_flush_seq(&c->journal, journal_seq);
index 307f287d95e674d46039d35b7054cf90a681e63d..079424227a1c9c8d1e00a556a6168e902c379213 100644 (file)
@@ -504,22 +504,6 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
                struct bucket *g2 = PTR_BUCKET(ca, &p.ptr, false);
                enum bch_data_type data_type = bch2_bkey_ptr_data_type(*k, &entry->ptr);
 
-               if (fsck_err_on(g->mark.data_type &&
-                               g->mark.data_type != data_type, c,
-                               "bucket %u:%zu different types of data in same bucket: %s, %s\n"
-                               "while marking %s",
-                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
-                               bch2_data_types[g->mark.data_type],
-                               bch2_data_types[data_type],
-                               (bch2_bkey_val_to_text(&PBUF(buf), c, *k), buf))) {
-                       if (data_type == BCH_DATA_btree) {
-                               g2->_mark.data_type = g->_mark.data_type = data_type;
-                               set_bit(BCH_FS_NEED_ALLOC_WRITE, &c->flags);
-                       } else {
-                               do_update = true;
-                       }
-               }
-
                if (fsck_err_on(!g->gen_valid, c,
                                "bucket %u:%zu data type %s ptr gen %u missing in alloc btree\n"
                                "while marking %s",
@@ -536,6 +520,19 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
                        }
                }
 
+               if (fsck_err_on(data_type == BCH_DATA_btree &&
+                               g->mark.gen != p.ptr.gen, c,
+                               "bucket %u:%zu data type %s has metadata but wrong gen: %u != %u\n"
+                               "while marking %s",
+                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
+                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                               p.ptr.gen, g->mark.gen,
+                               (bch2_bkey_val_to_text(&PBUF(buf), c, *k), buf))) {
+                       g2->_mark.data_type     = g->_mark.data_type    = data_type;
+                       g2->gen_valid           = g->gen_valid          = true;
+                       set_bit(BCH_FS_NEED_ALLOC_WRITE, &c->flags);
+               }
+
                if (fsck_err_on(gen_cmp(p.ptr.gen, g->mark.gen) > 0, c,
                                "bucket %u:%zu data type %s ptr gen in the future: %u > %u\n"
                                "while marking %s",
@@ -566,6 +563,26 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id,
                                (bch2_bkey_val_to_text(&PBUF(buf), c, *k), buf)))
                        do_update = true;
 
+               if (p.ptr.gen != g->mark.gen)
+                       continue;
+
+               if (fsck_err_on(g->mark.data_type &&
+                               g->mark.data_type != data_type, c,
+                               "bucket %u:%zu different types of data in same bucket: %s, %s\n"
+                               "while marking %s",
+                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
+                               bch2_data_types[g->mark.data_type],
+                               bch2_data_types[data_type],
+                               (bch2_bkey_val_to_text(&PBUF(buf), c, *k), buf))) {
+                       if (data_type == BCH_DATA_btree) {
+                               g2->_mark.data_type     = g->_mark.data_type    = data_type;
+                               g2->gen_valid           = g->gen_valid          = true;
+                               set_bit(BCH_FS_NEED_ALLOC_WRITE, &c->flags);
+                       } else {
+                               do_update = true;
+                       }
+               }
+
                if (p.has_ec) {
                        struct stripe *m = genradix_ptr(&c->stripes[true], p.ec.idx);