]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix assertion in bch2_btree_key_cache_drop()
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 12 Aug 2022 01:06:43 +0000 (21:06 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:38 +0000 (17:09 -0400)
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>
fs/bcachefs/btree_key_cache.c

index f0055f17381d615a9c9bf7da876b48e90f51d6fd..0e87c19effeb306c20868493c5f04d88c1210a40 100644 (file)
@@ -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,