57 lines
2.0 KiB
Diff
57 lines
2.0 KiB
Diff
From f97b3e7fd8f371eba3ae114eb8eb0dd3c6842771 Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Fri, 25 Oct 2024 22:31:20 -0400
|
|
Subject: [PATCH 062/233] bcachefs: Assert that we're not violating key cache
|
|
coherency rules
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
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>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/btree_key_cache.c | 13 ++++++++++---
|
|
1 file changed, 10 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c
|
|
index 244610b1d0b5..3bd40ea0fa3d 100644
|
|
--- a/fs/bcachefs/btree_key_cache.c
|
|
+++ b/fs/bcachefs/btree_key_cache.c
|
|
@@ -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) &&
|
|
--
|
|
2.45.2
|
|
|