summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-22 04:32:29 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-03-22 04:37:29 -0400
commit33e99d92555bb21f92a2df4578ccba74d027e1c8 (patch)
tree2dcd6ab9e8946cee9d00de3c29f8f6310a3511ba
parentc00267d4642ab7bf87172c1b1821b24a5e357269 (diff)
bcachefs: Fix a deadlock
-rw-r--r--fs/bcachefs/btree_update_leaf.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index c57a279cb644..596702427fb0 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -559,6 +559,8 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
trans_for_each_update_iter(trans, i)
BUG_ON(i->iter->uptodate >= BTREE_ITER_NEED_RELOCK);
+ btree_trans_lock_write(c, trans);
+
trans_for_each_update_iter(trans, i) {
if (i->deferred ||
!btree_node_type_needs_gc(i->iter->btree_id))
@@ -576,12 +578,10 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
}
}
- btree_trans_lock_write(c, trans);
-
if (race_fault()) {
ret = -EINTR;
trans_restart(" (race)");
- goto out_unlock;
+ goto out;
}
/*
@@ -591,7 +591,7 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
*/
ret = btree_trans_check_can_insert(trans, stopped_at);
if (ret)
- goto out_unlock;
+ goto out;
/*
* Don't get journal reservation until after we know insert will
@@ -599,7 +599,7 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
*/
ret = bch2_trans_journal_res_get(trans, JOURNAL_RES_GET_NONBLOCK);
if (ret)
- goto out_unlock;
+ goto out;
if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)) {
if (journal_seq_verify(c))
@@ -631,13 +631,13 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
trans_for_each_update(trans, i)
do_btree_insert_one(trans, i);
-out_unlock:
+out:
BUG_ON(ret &&
(trans->flags & BTREE_INSERT_JOURNAL_RESERVED) &&
trans->journal_res.ref);
btree_trans_unlock_write(trans);
-out:
+
if (fs_usage) {
bch2_fs_usage_scratch_put(c, fs_usage);
percpu_up_read(&c->mark_lock);