mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
e9e6f3ec53
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> |
||
---|---|---|
.. | ||
drbd_actlog.c | ||
drbd_bitmap.c | ||
drbd_int.h | ||
drbd_main.c | ||
drbd_nl.c | ||
drbd_proc.c | ||
drbd_receiver.c | ||
drbd_req.c | ||
drbd_req.h | ||
drbd_strings.c | ||
drbd_vli.h | ||
drbd_worker.c | ||
drbd_wrappers.h | ||
Kconfig | ||
Makefile |