summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-08-12 04:06:43 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:38 +0300
commit45b033fa1afd35a8eab0af003ffac9413548f476 (patch)
treeda8b076659887d2db70e68704f939e9d1a7c3768
parentff7dc3651d5bdcc9d9fe4ace3da21f0f5c2bd778 (diff)
downloadlinux-45b033fa1afd35a8eab0af003ffac9413548f476.tar.xz
bcachefs: Fix assertion in bch2_btree_key_cache_drop()
Turns out this assertion was something we could legitimately hit - add a comment describing what's going on, and handle it. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_key_cache.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c
index f0055f17381d..0e87c19effeb 100644
--- a/fs/bcachefs/btree_key_cache.c
+++ b/fs/bcachefs/btree_key_cache.c
@@ -639,11 +639,22 @@ bool bch2_btree_insert_key_cached(struct btree_trans *trans,
void bch2_btree_key_cache_drop(struct btree_trans *trans,
struct btree_path *path)
{
+ struct bch_fs *c = trans->c;
struct bkey_cached *ck = (void *) path->l[0].b;
- ck->valid = false;
+ BUG_ON(!ck->valid);
- BUG_ON(test_bit(BKEY_CACHED_DIRTY, &ck->flags));
+ /*
+ * We just did an update to the btree, bypassing the key cache: the key
+ * cache key is now stale and must be dropped, even if dirty:
+ */
+ if (test_bit(BKEY_CACHED_DIRTY, &ck->flags)) {
+ clear_bit(BKEY_CACHED_DIRTY, &ck->flags);
+ atomic_long_dec(&c->btree_key_cache.nr_dirty);
+ bch2_journal_pin_drop(&c->journal, &ck->journal);
+ }
+
+ ck->valid = false;
}
static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,