Skip to content

Commit

Permalink
md: suspend array in md_start_sync() if array need reconfiguration
Browse files Browse the repository at this point in the history
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@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20231010151958.145896-18-yukuai1@huaweicloud.com
  • Loading branch information
Yu Kuai authored and Song Liu committed Oct 11, 2023
1 parent b42cd7b commit bc08041
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -9417,8 +9417,13 @@ static void md_start_sync(struct work_struct *ws)
{
struct mddev *mddev = container_of(ws, struct mddev, sync_work);
int spares = 0;
bool suspend = false;

mddev_lock_nointr(mddev);
if (md_spares_need_change(mddev))
suspend = true;

suspend ? mddev_suspend_and_lock_nointr(mddev) :
mddev_lock_nointr(mddev);

if (!md_is_rdwr(mddev)) {
/*
Expand Down Expand Up @@ -9454,7 +9459,7 @@ static void md_start_sync(struct work_struct *ws)
goto not_running;
}

mddev_unlock(mddev);
suspend ? mddev_unlock_and_resume(mddev) : mddev_unlock(mddev);
md_wakeup_thread(mddev->sync_thread);
sysfs_notify_dirent_safe(mddev->sysfs_action);
md_new_event();
Expand All @@ -9466,7 +9471,7 @@ static void md_start_sync(struct work_struct *ws)
clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
mddev_unlock(mddev);
suspend ? mddev_unlock_and_resume(mddev) : mddev_unlock(mddev);

wake_up(&resync_wait);
if (test_and_clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery) &&
Expand Down

0 comments on commit bc08041

Please sign in to comment.