FAILED: Patch "md/dm-raid: don't call md_reap_sync_thread() directly" failed to apply to 6.1-stable tree
Subsystems (2)
Sasha Levin
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From cd32b27a66db8776d8b8e82ec7d7dde97a8693b0 Mon Sep 17 00:00:00 2001
From: Yu Kuai <[email protected]>
Date: Tue, 5 Mar 2024 15:23:03 +0800
Subject: [PATCH] md/dm-raid: don't call md_reap_sync_thread() directly
Currently md_reap_sync_thread() is called from raid_message() directly without holding 'reconfig_mutex', this is definitely unsafe because md_reap_sync_thread() can change many fields that is protected by 'reconfig_mutex'.
However, hold 'reconfig_mutex' here is still problematic because this will cause deadlock, for example, commit 130443d60b1b ("md: refactor idle/frozen_sync_thread() to fix deadlock").
Fix this problem by using stop_sync_thread() to unregister sync_thread, like md/raid did.
--- drivers/md/dm-raid.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/md/dm-raid.c +18 -10
@@ -3719,6 +3719,7 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv, {struct raid_set *rs = ti->private;struct mddev *mddev = &rs->md; +int ret =0 ;if (!mddev->pers || !mddev->pers->sync_request)return -EINVAL ;
@@ -3726,17 +3727,24 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv,if (test_bit (RT_FLAG_RS_SUSPENDED , &rs->runtime_flags))return -EBUSY ; -if (!strcasecmp (argv[0 ],"frozen" )) -set_bit (MD_RECOVERY_FROZEN , &mddev->recovery); -else -clear_bit (MD_RECOVERY_FROZEN , &mddev->recovery); +if (!strcasecmp (argv[0 ],"frozen" )) { + ret =mddev_lock (mddev); +if (ret) +return ret; -if (!strcasecmp (argv[0 ],"idle" ) || !strcasecmp (argv[0 ],"frozen" )) { -if (mddev->sync_thread) { -set_bit (MD_RECOVERY_INTR , &mddev->recovery); -md_reap_sync_thread (mddev); - } - }else if (decipher_sync_action (mddev, mddev->recovery) != st_idle) +md_frozen_sync_thread (mddev); +mddev_unlock (mddev); + }else if (!strcasecmp (argv[0 ],"idle" )) { + ret =mddev_lock (mddev); +if (ret) +return ret; + +md_idle_sync_thread (mddev); +mddev_unlock (mddev); + } + +clear_bit (MD_RECOVERY_FROZEN , &mddev->recovery); +if (decipher_sync_action (mddev, mddev->recovery) != st_idle)return -EBUSY ;else if (!strcasecmp (argv[0 ],"resync" )) ;/* MD_RECOVERY_NEEDED set below */
Signature · 1 line
2.43.0