diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-01-27 18:03:58 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-01-27 18:24:13 -0500 |
commit | 1a1d1c2086c73679c56729b848f4fa96ff615dea (patch) | |
tree | fb66aa19b8edd4098e7aa69c4c2238527a383089 | |
parent | 80e4c1fcb4b57f3d41323841674a14b9cabc470d (diff) |
bcachefs: fix a deadlock
-rw-r--r-- | fs/bcachefs/btree_io.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 5 |
2 files changed, 4 insertions, 5 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index e77e2da3a316..7e801e127faf 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1333,7 +1333,7 @@ static void btree_node_read_endio(struct bio *bio) bch2_latency_acct(rb->pick.ca, rb->start_time >> 10, READ); INIT_WORK(&rb->work, btree_node_read_work); - schedule_work(&rb->work); + queue_work(system_unbound_wq, &rb->work); } void bch2_btree_node_read(struct bch_fs *c, struct btree *b, @@ -1583,7 +1583,7 @@ static void btree_node_write_endio(struct bio *bio) container_of(orig, struct btree_write_bio, wbio); INIT_WORK(&wb->work, btree_node_write_work); - schedule_work(&wb->work); + queue_work(system_unbound_wq, &wb->work); } } diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index bdaa5c0299a5..41d78eb480bc 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -611,8 +611,7 @@ static void btree_update_nodes_reachable(struct closure *cl) while (as->nr_new_nodes) { struct btree *b = as->new_nodes[--as->nr_new_nodes]; - BUG_ON(b->will_make_reachable && - (struct btree_update *) b->will_make_reachable != as); + BUG_ON(b->will_make_reachable != (unsigned long) as); b->will_make_reachable = 0; mutex_unlock(&c->btree_interior_update_lock); @@ -674,7 +673,7 @@ retry: * b->write_blocked prevented it from being written, so * write it now if it needs to be written: */ - bch2_btree_node_write_cond(c, b, btree_node_need_write(b)); + bch2_btree_node_write_cond(c, b, true); six_unlock_read(&b->lock); break; |