From: Yu Kuai <yukuai3@xxxxxxxxxx> So that io won't concurrent with array reconfiguration, and it's safe to suspend the array directly because normal io won't rely on md_start_sync(). Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- drivers/md/md.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/md/md.c b/drivers/md/md.c index 305694b67fd7..0bb4c59543aa 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9457,6 +9457,12 @@ static void md_start_sync(struct work_struct *ws) { struct mddev *mddev = container_of(ws, struct mddev, sync_work); int spares = 0; + bool suspended = false; + + if (md_spares_need_change(mddev)) { + __mddev_suspend(mddev); + suspended = true; + } mddev_lock_nointr(mddev); @@ -9495,6 +9501,9 @@ static void md_start_sync(struct work_struct *ws) } mddev_unlock(mddev); + if (suspended) + __mddev_resume(mddev); + md_wakeup_thread(mddev->sync_thread); sysfs_notify_dirent_safe(mddev->sysfs_action); md_new_event(); @@ -9507,6 +9516,8 @@ static void md_start_sync(struct work_struct *ws) clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); mddev_unlock(mddev); + if (suspended) + __mddev_resume(mddev); wake_up(&resync_wait); if (test_and_clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery) && -- 2.39.2