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-30 20:41:33 -0500 |
commit | ff8d9cca2b620e1f6700d2a53c759f5505c95fae (patch) | |
tree | b614d2bfa81e09a5c66e888798e268b12b362b93 | |
parent | 6b351749d25ab6c363d298662f39c287bc2aa2e2 (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 fad1b200a70f..f1603811e010 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; |