From 81ec711645f8f83b4876ae3cc85e62e98de55f70 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 22 Sep 2022 18:54:32 -0400 Subject: bcachefs: Wake up all processes in cycle when deadlock detected Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_locking.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 1242499cf07a..ac64ec531b4f 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) -- cgit v1.2.3