]> www.infradead.org Git - linux.git/commitdiff
bcachefs: Fix btree node keys accounting in topology repair path
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 26 Mar 2024 20:39:54 +0000 (16:39 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 1 Apr 2024 00:36:11 +0000 (20:36 -0400)
When dropping keys now outside a now because we're changing the node
min/max, we need to redo the node's accounting as well.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bset.c
fs/bcachefs/bset.h
fs/bcachefs/btree_io.c
fs/bcachefs/btree_update_interior.c

index 3fd1085b6c61ee72e7e814cf722306ebdba057c4..3bb477840eab6b1461f454c3c71b386589aa4afb 100644 (file)
@@ -134,18 +134,24 @@ void bch2_dump_btree_node_iter(struct btree *b,
        printbuf_exit(&buf);
 }
 
-#ifdef CONFIG_BCACHEFS_DEBUG
-
-void __bch2_verify_btree_nr_keys(struct btree *b)
+struct btree_nr_keys bch2_btree_node_count_keys(struct btree *b)
 {
        struct bset_tree *t;
        struct bkey_packed *k;
-       struct btree_nr_keys nr = { 0 };
+       struct btree_nr_keys nr = {};
 
        for_each_bset(b, t)
                bset_tree_for_each_key(b, t, k)
                        if (!bkey_deleted(k))
                                btree_keys_account_key_add(&nr, t - b->set, k);
+       return nr;
+}
+
+#ifdef CONFIG_BCACHEFS_DEBUG
+
+void __bch2_verify_btree_nr_keys(struct btree *b)
+{
+       struct btree_nr_keys nr = bch2_btree_node_count_keys(b);
 
        BUG_ON(memcmp(&nr, &b->nr, sizeof(nr)));
 }
index 79c77baaa383868c99660a78a656c73d187f996f..120a79fd456bd5ccb50c2608aac4940b63cfeed9 100644 (file)
@@ -458,6 +458,8 @@ struct bkey_s_c bch2_btree_node_iter_peek_unpack(struct btree_node_iter *,
 
 /* Accounting: */
 
+struct btree_nr_keys bch2_btree_node_count_keys(struct btree *);
+
 static inline void btree_keys_account_key(struct btree_nr_keys *n,
                                          unsigned bset,
                                          struct bkey_packed *k,
index b85e2cd61c381b163f3a03fbb73692d13be0853f..9c71e6fb9c41b6f47fd9a178006e5f420f53a83b 100644 (file)
@@ -654,6 +654,7 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
         */
        bch2_bset_set_no_aux_tree(b, b->set);
        bch2_btree_build_aux_trees(b);
+       b->nr = bch2_btree_node_count_keys(b);
 
        struct bkey_s_c k;
        struct bkey unpacked;
index aae7a2687eee707899d0f2d692a1d82eba32dd03..826cebe4bce0786935fbc863ae2b4601df4a7f5c 100644 (file)
@@ -1543,6 +1543,7 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
        u64 start_time = local_clock();
        int ret = 0;
 
+       bch2_verify_btree_nr_keys(b);
        BUG_ON(!parent && (b != btree_node_root(c, b)));
        BUG_ON(parent && !btree_node_intent_locked(trans->paths + path, b->c.level + 1));