aboutsummaryrefslogtreecommitdiffstats
path: root/lib/locking-selftest-rsem.h
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2010-09-14 14:26:27 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2010-10-14 12:38:50 -0400
commite9e6f3ec535d7b7c9e2ca64ad691e743e7d3c2f0 (patch)
treecbc17d81b9d937b4fc515548f30f5ed00be193ee /lib/locking-selftest-rsem.h
parent22cc37a943832c948808884604ec6f5ff2594c1d (diff)
drbd: fix for possible deadlock on IO error during resync
Scenario: Something (say, flush-147:0) is in drbd_al_begin_io, holding a local_cnt, waiting for the resync to make progress. Disk fails, worker in after_state_ch does drbd_rs_cancel_all, then waits for local_cnt to drop to zero. flush-147:0 is woken by drbd_rs_cancel_all, needs to write an AL transaction, and queues that on the worker. Deadlock. Fix: do not wait in the worker, have put_ldev() trigger the state change D_FAILED -> D_DISKLESS when necessary. put_ldev() cannot do the state change directly, as it may or may not already hold various spinlocks. We queue a short work instead. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'lib/locking-selftest-rsem.h')
0 files changed, 0 insertions, 0 deletions