bcachefs: Split out btree_error_wq
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 28 May 2021 01:38:00 +0000 (21:38 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:04 +0000 (17:09 -0400)
We can't use btree_update_wq becuase btree updates may be waiting on
btree writes to complete.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_io.c
fs/bcachefs/super.c

index 2ed795a58c8185cd0b12f3e6ee6e1f91d6993b72..6962b3ddf575ff8cca7755237bd1f81f5201b9cc 100644 (file)
@@ -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;
 
index 18d12c012cc6e7e77d452d8dfea882fc4e83aea2..0f2a730e04b59d8c685cec8e8b7b38c4e63f7f6a 100644 (file)
@@ -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;
        }
 
index 62f9fee51b37f6b89f05c9d84a10a3012d2b3d80..3bea7917004f4ab91cb170a08f9ef57b6af437c9 100644 (file)
@@ -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",