summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_locking.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2022-09-22 18:54:32 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2022-09-22 18:59:33 -0400
commit8ac57ee8356989fcd0831bcc73d966f035890738 (patch)
treea56bf582bf4d33b4208332ef02c84a7dbc590e1e /fs/bcachefs/btree_locking.c
parent659563c3e745b56009638d2cab11243f65e69553 (diff)
bcachefs: Wake up all processes in cycle when deadlock detectedbcachefs-deadlock-avoidance
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_locking.c')
-rw-r--r--fs/bcachefs/btree_locking.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c
index a8a1976b39fd..9302f980fb13 100644
--- a/fs/bcachefs/btree_locking.c
+++ b/fs/bcachefs/btree_locking.c
@@ -89,14 +89,19 @@ static noinline void print_cycle(struct printbuf *out, struct lock_graph *g)
static int abort_lock(struct lock_graph *g, struct trans_waiting_for_lock *i)
{
+ int ret;
+
if (i == g->g) {
trace_and_count(i->trans->c, trans_restart_would_deadlock, i->trans, _RET_IP_);
- return btree_trans_restart(i->trans, BCH_ERR_transaction_restart_would_deadlock);
+ ret = btree_trans_restart(i->trans, BCH_ERR_transaction_restart_would_deadlock);
} else {
i->trans->lock_must_abort = true;
- wake_up_process(i->trans->locking_wait.task);
- return 1;
+ ret = 1;
}
+
+ for (i = g->g + 1; i < g->g + g->nr; i++)
+ wake_up_process(i->trans->locking_wait.task);
+ return ret;
}
static noinline int break_cycle(struct lock_graph *g)