Commit 35228ecb authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Don't keep nodes in btree_reserve locked

These nodes aren't reachable by other threads, so there's no need to
keep it locked - and this fixes a bug with the assertion in
bch2_trans_unlock() firing on transaction restart.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent b74b147d
...@@ -243,6 +243,8 @@ static struct btree *__bch2_btree_node_alloc(struct bch_fs *c, ...@@ -243,6 +243,8 @@ static struct btree *__bch2_btree_node_alloc(struct bch_fs *c,
bch2_alloc_sectors_done(c, wp); bch2_alloc_sectors_done(c, wp);
mem_alloc: mem_alloc:
b = bch2_btree_node_mem_alloc(c); b = bch2_btree_node_mem_alloc(c);
six_unlock_write(&b->c.lock);
six_unlock_intent(&b->c.lock);
/* we hold cannibalize_lock: */ /* we hold cannibalize_lock: */
BUG_ON(IS_ERR(b)); BUG_ON(IS_ERR(b));
...@@ -265,6 +267,9 @@ static struct btree *bch2_btree_node_alloc(struct btree_update *as, unsigned lev ...@@ -265,6 +267,9 @@ static struct btree *bch2_btree_node_alloc(struct btree_update *as, unsigned lev
b = as->prealloc_nodes[--as->nr_prealloc_nodes]; b = as->prealloc_nodes[--as->nr_prealloc_nodes];
six_lock_intent(&b->c.lock, NULL, NULL);
six_lock_write(&b->c.lock, NULL, NULL);
set_btree_node_accessed(b); set_btree_node_accessed(b);
set_btree_node_dirty(c, b); set_btree_node_dirty(c, b);
set_btree_node_need_write(b); set_btree_node_need_write(b);
...@@ -378,7 +383,8 @@ static void bch2_btree_reserve_put(struct btree_update *as) ...@@ -378,7 +383,8 @@ static void bch2_btree_reserve_put(struct btree_update *as)
while (as->nr_prealloc_nodes) { while (as->nr_prealloc_nodes) {
struct btree *b = as->prealloc_nodes[--as->nr_prealloc_nodes]; struct btree *b = as->prealloc_nodes[--as->nr_prealloc_nodes];
six_unlock_write(&b->c.lock); six_lock_intent(&b->c.lock, NULL, NULL);
six_lock_write(&b->c.lock, NULL, NULL);
if (c->btree_reserve_cache_nr < if (c->btree_reserve_cache_nr <
ARRAY_SIZE(c->btree_reserve_cache)) { ARRAY_SIZE(c->btree_reserve_cache)) {
...@@ -392,10 +398,8 @@ static void bch2_btree_reserve_put(struct btree_update *as) ...@@ -392,10 +398,8 @@ static void bch2_btree_reserve_put(struct btree_update *as)
bch2_open_buckets_put(c, &b->ob); bch2_open_buckets_put(c, &b->ob);
} }
btree_node_lock_type(c, b, SIX_LOCK_write);
__btree_node_free(c, b); __btree_node_free(c, b);
six_unlock_write(&b->c.lock); six_unlock_write(&b->c.lock);
six_unlock_intent(&b->c.lock); six_unlock_intent(&b->c.lock);
} }
......
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