aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2009-10-23 07:57:45 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2009-11-04 09:21:03 -0500
commite656ec8ae2c0319b6d52834695f9635217d62de5 (patch)
tree47930af0bbf1bbcfe475524dab913b31e3a8e035
parent0a4921662513ae60dc638c8e13fbe3439d84db64 (diff)
Do not deadlock in drbd_disconnect() [bugz 258]
When there are many blocks on the fly (ua), and the AL gets into "starving" mode (random IO, scattered all over the device), and the connections gets interrupted, the receiver thread deadlocks in the drbd_disconnect() code path. Affected are only nodes in Primary role. The bug triggers most likely on system that mirror over "long distances" Regression introduced shortly before 8.3.3 with git commit 31e0f1250f174ac1ee317f360943a0159e19edc8 Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r--drivers/block/drbd/drbd_receiver.c4
1 files changed, 0 insertions, 4 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index d9312b45393f..9bbc509443e5 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -3619,10 +3619,6 @@ static void drbd_disconnect(struct drbd_conf *mdev)
3619 set_bit(STOP_SYNC_TIMER, &mdev->flags); 3619 set_bit(STOP_SYNC_TIMER, &mdev->flags);
3620 resync_timer_fn((unsigned long)mdev); 3620 resync_timer_fn((unsigned long)mdev);
3621 3621
3622 /* so we can be sure that all remote or resync reads
3623 * made it at least to net_ee */
3624 wait_event(mdev->misc_wait, !atomic_read(&mdev->local_cnt));
3625
3626 /* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier, 3622 /* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier,
3627 * w_make_resync_request etc. which may still be on the worker queue 3623 * w_make_resync_request etc. which may still be on the worker queue
3628 * to be "canceled" */ 3624 * to be "canceled" */