]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Assert that we're not violating key cache coherency rules
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 26 Oct 2024 02:31:20 +0000 (22:31 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:17 +0000 (01:36 -0500)
We're not allowed to have a dirty key in the key cache if the key
doesn't exist at all in the btree - creation has to bypass the key
cache, so that iteration over the btree can check if the key is present
in the key cache.

Things break in subtle ways if cache coherency is broken, so this needs
an assert.

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

index 244610b1d0b595501094a9c107c9fbb4d438e68c..3bd40ea0fa3dba73915e882f285b2eb038d75559 100644 (file)
@@ -424,8 +424,15 @@ static int btree_key_cache_flush_pos(struct btree_trans *trans,
            !test_bit(JOURNAL_space_low, &c->journal.flags))
                commit_flags |= BCH_TRANS_COMMIT_no_journal_res;
 
-       ret   = bch2_btree_iter_traverse(&b_iter) ?:
-               bch2_trans_update(trans, &b_iter, ck->k,
+       struct bkey_s_c btree_k = bch2_btree_iter_peek_slot(&b_iter);
+       ret = bkey_err(btree_k);
+       if (ret)
+               goto err;
+
+       /* * Check that we're not violating cache coherency rules: */
+       BUG_ON(bkey_deleted(btree_k.k));
+
+       ret   = bch2_trans_update(trans, &b_iter, ck->k,
                                  BTREE_UPDATE_key_cache_reclaim|
                                  BTREE_UPDATE_internal_snapshot_node|
                                  BTREE_TRIGGER_norun) ?:
@@ -433,7 +440,7 @@ static int btree_key_cache_flush_pos(struct btree_trans *trans,
                                  BCH_TRANS_COMMIT_no_check_rw|
                                  BCH_TRANS_COMMIT_no_enospc|
                                  commit_flags);
-
+err:
        bch2_fs_fatal_err_on(ret &&
                             !bch2_err_matches(ret, BCH_ERR_transaction_restart) &&
                             !bch2_err_matches(ret, BCH_ERR_journal_reclaim_would_deadlock) &&