From: Kent Overstreet Date: Fri, 28 May 2021 01:38:00 +0000 (-0400) Subject: bcachefs: Split out btree_error_wq X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=9f2772c45460e420de9a88980129bef135c6b76f;p=linux.git bcachefs: Split out btree_error_wq We can't use btree_update_wq becuase btree updates may be waiting on btree writes to complete. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index 2ed795a58c818..6962b3ddf575f 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -667,6 +667,7 @@ struct bch_fs { struct btree_key_cache btree_key_cache; struct workqueue_struct *btree_update_wq; + struct workqueue_struct *btree_error_wq; /* copygc needs its own workqueue for index updates.. */ struct workqueue_struct *copygc_wq; diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index 18d12c012cc6e..0f2a730e04b59 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1618,7 +1618,7 @@ static void btree_node_write_work(struct work_struct *work) bio_list_add(&c->btree_write_error_list, &wbio->wbio.bio); spin_unlock_irqrestore(&c->btree_write_error_lock, flags); - queue_work(c->btree_update_wq, &c->btree_write_error_work); + queue_work(c->btree_error_wq, &c->btree_write_error_work); return; } diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index 62f9fee51b37f..3bea7917004f4 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -514,6 +514,8 @@ static void __bch2_fs_free(struct bch_fs *c) destroy_workqueue(c->io_complete_wq ); if (c->copygc_wq) destroy_workqueue(c->copygc_wq); + if (c->btree_error_wq) + destroy_workqueue(c->btree_error_wq); if (c->btree_update_wq) destroy_workqueue(c->btree_update_wq); @@ -766,6 +768,8 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts) if (!(c->btree_update_wq = alloc_workqueue("bcachefs", WQ_FREEZABLE|WQ_MEM_RECLAIM, 1)) || + !(c->btree_error_wq = alloc_workqueue("bcachefs_error", + WQ_FREEZABLE|WQ_MEM_RECLAIM, 1)) || !(c->copygc_wq = alloc_workqueue("bcachefs_copygc", WQ_FREEZABLE|WQ_MEM_RECLAIM|WQ_CPU_INTENSIVE, 1)) || !(c->io_complete_wq = alloc_workqueue("bcachefs_io",