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-22 18:59:33 -0400 |
commit | 8ac57ee8356989fcd0831bcc73d966f035890738 (patch) | |
tree | a56bf582bf4d33b4208332ef02c84a7dbc590e1e /fs/bcachefs/btree_locking.c | |
parent | 659563c3e745b56009638d2cab11243f65e69553 (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.c | 11 |
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) |