summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-01-27 18:03:58 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-01-27 18:24:13 -0500
commit1a1d1c2086c73679c56729b848f4fa96ff615dea (patch)
treefb66aa19b8edd4098e7aa69c4c2238527a383089
parent80e4c1fcb4b57f3d41323841674a14b9cabc470d (diff)
bcachefs: fix a deadlock
-rw-r--r--fs/bcachefs/btree_io.c4
-rw-r--r--fs/bcachefs/btree_update_interior.c5
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;