]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_io.c
Update bcachefs sources to e1f6739c4a bcachefs: Fix another iterator counting bug
[bcachefs-tools-debian] / libbcachefs / btree_io.c
index ac8b98861aae1f5178db3e16c002ba7775a8bbdd..63063748d4f5f3168698811d5556cb2602a13acc 100644 (file)
@@ -736,6 +736,17 @@ static int validate_bset(struct bch_fs *c, struct btree *b,
                struct btree_node *bn =
                        container_of(i, struct btree_node, keys);
                /* These indicate that we read the wrong btree node: */
+
+               if (b->key.k.type == KEY_TYPE_btree_ptr_v2) {
+                       struct bch_btree_ptr_v2 *bp =
+                               &bkey_i_to_btree_ptr_v2(&b->key)->v;
+
+                       /* XXX endianness */
+                       btree_err_on(bp->seq != bn->keys.seq,
+                                    BTREE_ERR_MUST_RETRY, c, b, NULL,
+                                    "incorrect sequence number (wrong btree node)");
+               }
+
                btree_err_on(BTREE_NODE_ID(bn) != b->btree_id,
                             BTREE_ERR_MUST_RETRY, c, b, i,
                             "incorrect btree id");
@@ -1626,6 +1637,11 @@ void __bch2_btree_node_write(struct bch_fs *c, struct btree *b,
         * reflect that those writes were done and the data flushed from the
         * journal:
         *
+        * Also on journal error, the pending write may have updates that were
+        * never journalled (interior nodes, see btree_update_nodes_written()) -
+        * it's critical that we don't do the write in that case otherwise we
+        * will have updates visible that weren't in the journal:
+        *
         * Make sure to update b->written so bch2_btree_init_next() doesn't
         * break:
         */