Skip to content

Commit a0a466e

Browse files
author
Kent Overstreet
committed
bcachefs: Split out btree_node_rewrite_worker
This fixes a deadlock due to using btree_interior_update_worker for non interior updates - async btree node rewrites were blocking, and then blocking other interior updates. Signed-off-by: Kent Overstreet <[email protected]>
1 parent 37bb9c9 commit a0a466e

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

fs/bcachefs/bcachefs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,8 @@ struct bch_fs {
849849
struct workqueue_struct *btree_interior_update_worker;
850850
struct work_struct btree_interior_update_work;
851851

852+
struct workqueue_struct *btree_node_rewrite_worker;
853+
852854
struct list_head pending_node_rewrites;
853855
struct mutex pending_node_rewrites_lock;
854856

fs/bcachefs/btree_update_interior.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,7 +2161,7 @@ void bch2_btree_node_rewrite_async(struct bch_fs *c, struct btree *b)
21612161
bch2_write_ref_get(c, BCH_WRITE_REF_node_rewrite);
21622162
}
21632163

2164-
queue_work(c->btree_interior_update_worker, &a->work);
2164+
queue_work(c->btree_node_rewrite_worker, &a->work);
21652165
}
21662166

21672167
void bch2_do_pending_node_rewrites(struct bch_fs *c)
@@ -2173,7 +2173,7 @@ void bch2_do_pending_node_rewrites(struct bch_fs *c)
21732173
list_del(&a->list);
21742174

21752175
bch2_write_ref_get(c, BCH_WRITE_REF_node_rewrite);
2176-
queue_work(c->btree_interior_update_worker, &a->work);
2176+
queue_work(c->btree_node_rewrite_worker, &a->work);
21772177
}
21782178
mutex_unlock(&c->pending_node_rewrites_lock);
21792179
}
@@ -2510,6 +2510,8 @@ bch2_btree_roots_to_journal_entries(struct bch_fs *c,
25102510

25112511
void bch2_fs_btree_interior_update_exit(struct bch_fs *c)
25122512
{
2513+
if (c->btree_node_rewrite_worker)
2514+
destroy_workqueue(c->btree_node_rewrite_worker);
25132515
if (c->btree_interior_update_worker)
25142516
destroy_workqueue(c->btree_interior_update_worker);
25152517
mempool_exit(&c->btree_interior_update_pool);
@@ -2534,6 +2536,11 @@ int bch2_fs_btree_interior_update_init(struct bch_fs *c)
25342536
if (!c->btree_interior_update_worker)
25352537
return -BCH_ERR_ENOMEM_btree_interior_update_worker_init;
25362538

2539+
c->btree_node_rewrite_worker =
2540+
alloc_ordered_workqueue("btree_node_rewrite", WQ_UNBOUND);
2541+
if (!c->btree_node_rewrite_worker)
2542+
return -BCH_ERR_ENOMEM_btree_interior_update_worker_init;
2543+
25372544
if (mempool_init_kmalloc_pool(&c->btree_interior_update_pool, 1,
25382545
sizeof(struct btree_update)))
25392546
return -BCH_ERR_ENOMEM_btree_interior_update_pool_init;

0 commit comments

Comments
 (0)