Commit 5b3008bc authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: Don't call bch2_journal_pin_drop() under key cache lock

This fixes a (harmless) lockdep splat, due to a lock order violation in
the key cache exit path.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 91db8066
...@@ -947,6 +947,7 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc) ...@@ -947,6 +947,7 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
struct bucket_table *tbl; struct bucket_table *tbl;
struct bkey_cached *ck, *n; struct bkey_cached *ck, *n;
struct rhash_head *pos; struct rhash_head *pos;
LIST_HEAD(items);
unsigned i; unsigned i;
#ifdef __KERNEL__ #ifdef __KERNEL__
int cpu; int cpu;
...@@ -967,7 +968,7 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc) ...@@ -967,7 +968,7 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
for (i = 0; i < tbl->size; i++) for (i = 0; i < tbl->size; i++)
rht_for_each_entry_rcu(ck, pos, tbl, i, hash) { rht_for_each_entry_rcu(ck, pos, tbl, i, hash) {
bkey_cached_evict(bc, ck); bkey_cached_evict(bc, ck);
list_add(&ck->list, &bc->freed_nonpcpu); list_add(&ck->list, &items);
} }
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -979,14 +980,17 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc) ...@@ -979,14 +980,17 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
for (i = 0; i < f->nr; i++) { for (i = 0; i < f->nr; i++) {
ck = f->objs[i]; ck = f->objs[i];
list_add(&ck->list, &bc->freed_nonpcpu); list_add(&ck->list, &items);
} }
} }
#endif #endif
list_splice(&bc->freed_pcpu, &bc->freed_nonpcpu); list_splice(&bc->freed_pcpu, &items);
list_splice(&bc->freed_nonpcpu, &items);
list_for_each_entry_safe(ck, n, &bc->freed_nonpcpu, list) { mutex_unlock(&bc->lock);
list_for_each_entry_safe(ck, n, &items, list) {
cond_resched(); cond_resched();
bch2_journal_pin_drop(&c->journal, &ck->journal); bch2_journal_pin_drop(&c->journal, &ck->journal);
...@@ -1008,8 +1012,6 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc) ...@@ -1008,8 +1012,6 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
panic("btree key cache shutdown error: nr_keys nonzero (%li)\n", panic("btree key cache shutdown error: nr_keys nonzero (%li)\n",
atomic_long_read(&bc->nr_keys)); atomic_long_read(&bc->nr_keys));
mutex_unlock(&bc->lock);
if (bc->table_init_done) if (bc->table_init_done)
rhashtable_destroy(&bc->table); rhashtable_destroy(&bc->table);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment