From accd3a907b06af9d531e5e0e52403c592b19d96d Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 9 Mar 2021 10:38:38 +0100 Subject: [PATCH] md: Avoid sync_action sync->idle transition deadlock When a mdraid recovery/check is paused by writing "idle" to sync_action, sometimes the system deadlocks [1]. The latest fix proposed by the maintainer is not valid [2]. Use the fix we proposed ourself [3] until upstream comes up with something better. [1]: https://lore.kernel.org/linux-raid/5ed54ffc-ce82-bf66-4eff-390cb23bc1ac@molgen.mpg.de/T/#m28b00fdf4749f55c83282b20485c554ec199a108 [2]: https://lore.kernel.org/linux-raid/7fdb9726-4b1f-e04c-2451-f47139ddc05b@cloud.ionos.com/T/#m78c755f6b43a9c06d2c85b9d4e49c19657ddb155 [3]: https://lore.kernel.org/linux-raid/5ed54ffc-ce82-bf66-4eff-390cb23bc1ac@molgen.mpg.de/T/#m8a1d4c25781b8c3032ef38e3ffec425714515a16 --- drivers/md/md.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/md/md.c b/drivers/md/md.c index cc3876500c4b2..e0e1111df392b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4858,12 +4858,14 @@ action_store(struct mddev *mddev, const char *page, size_t len) clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && mddev_lock(mddev) == 0) { + set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags); if (work_pending(&mddev->del_work)) flush_workqueue(md_misc_wq); if (mddev->sync_thread) { set_bit(MD_RECOVERY_INTR, &mddev->recovery); md_reap_sync_thread(mddev); } + clear_bit(MD_ALLOW_SB_UPDATE, &mddev->flags); mddev_unlock(mddev); } } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))