diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-09-22 18:54:32 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-09-23 01:00:26 -0400 |
commit | 81ec711645f8f83b4876ae3cc85e62e98de55f70 (patch) | |
tree | fc75d9e674116031c518bbea89f5a5bbd7f05820 | |
parent | 20aed42713286b2966f3a5c9d458e441db8f4f5f (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.c | 11 |
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) |