mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 05:09:17 -04:00
bcachefs: Lock ordering fix
Can't take btree node locks while holding btree_reserve_cache_lock - it would be nice if we could check this with lockdep. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
committed by
Kent Overstreet
parent
c0960603e2
commit
fd4cecd258
@@ -383,16 +383,13 @@ static void bch2_btree_reserve_put(struct btree_update *as)
|
||||
struct bch_fs *c = as->c;
|
||||
struct prealloc_nodes *p;
|
||||
|
||||
mutex_lock(&c->btree_reserve_cache_lock);
|
||||
|
||||
for (p = as->prealloc_nodes;
|
||||
p < as->prealloc_nodes + ARRAY_SIZE(as->prealloc_nodes);
|
||||
p++) {
|
||||
while (p->nr) {
|
||||
struct btree *b = p->b[--p->nr];
|
||||
|
||||
six_lock_intent(&b->c.lock, NULL, NULL);
|
||||
six_lock_write(&b->c.lock, NULL, NULL);
|
||||
mutex_lock(&c->btree_reserve_cache_lock);
|
||||
|
||||
if (c->btree_reserve_cache_nr <
|
||||
ARRAY_SIZE(c->btree_reserve_cache)) {
|
||||
@@ -406,13 +403,15 @@ static void bch2_btree_reserve_put(struct btree_update *as)
|
||||
bch2_open_buckets_put(c, &b->ob);
|
||||
}
|
||||
|
||||
mutex_unlock(&c->btree_reserve_cache_lock);
|
||||
|
||||
six_lock_intent(&b->c.lock, NULL, NULL);
|
||||
six_lock_write(&b->c.lock, NULL, NULL);
|
||||
__btree_node_free(c, b);
|
||||
six_unlock_write(&b->c.lock);
|
||||
six_unlock_intent(&b->c.lock);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&c->btree_reserve_cache_lock);
|
||||
}
|
||||
|
||||
static int bch2_btree_reserve_get(struct btree_trans *trans,
|
||||
|
||||
Reference in New Issue
Block a user