summaryrefslogtreecommitdiff
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-23 01:00:26 -0400
commit81ec711645f8f83b4876ae3cc85e62e98de55f70 (patch)
treefc75d9e674116031c518bbea89f5a5bbd7f05820
parent20aed42713286b2966f3a5c9d458e441db8f4f5f (diff)
bcachefs: Wake up all processes in cycle when deadlock detected
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-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 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)