diff options
| author | Chen Cheng <chencheng@fnnas.com> | 2026-07-11 18:03:50 +0800 |
|---|---|---|
| committer | Yu Kuai <yukuai@fygo.io> | 2026-07-31 05:40:01 +0800 |
| commit | 798d79a7e4b04819a8ee575e5e1911215489e2ae (patch) | |
| tree | b07a31b13d433de2f0add817abca0ac571ea0bf2 /drivers | |
| parent | 6bc3deb600ee8c234204c6f4ea703ee04a11de2f (diff) | |
| download | linux-798d79a7e4b04819a8ee575e5e1911215489e2ae.tar.gz linux-798d79a7e4b04819a8ee575e5e1911215489e2ae.zip | |
md: suspend array when sync_action=reshape
raid10 needs to resize/swap r10bio_pool when reshape changes
raid_disks, and, don't let new requests keep allocating r10bio
objects from the old pool while that transition is in progress.
suspend and lock array before mddev_start_reshape(), and resume
it on exit.
Other sync_action ops are unchanged.
Signed-off-by: Chen Cheng <chencheng@fnnas.com>
Link: https://patch.msgid.link/20260711100352.425177-2-chencheng@fnnas.com
Signed-off-by: Yu Kuai <yukuai@fygo.io>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/md/md.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index c6b9b4705c94..addf3aeec85f 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5263,21 +5263,28 @@ action_store(struct mddev *mddev, const char *page, size_t len) if (!mddev->pers || !mddev->pers->sync_request) return -EINVAL; + action = md_sync_action_by_name(page); + if (action == ACTION_RESHAPE) { + ret = mddev_suspend(mddev, true); + if (ret) + return ret; + } retry: if (work_busy(&mddev->sync_work)) flush_work(&mddev->sync_work); ret = mddev_lock(mddev); - if (ret) + if (ret) { + if (action == ACTION_RESHAPE) + mddev_resume(mddev); return ret; + } if (work_busy(&mddev->sync_work)) { mddev_unlock(mddev); goto retry; } - action = md_sync_action_by_name(page); - /* TODO: mdadm rely on "idle" to start sync_thread. */ if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { switch (action) { @@ -5347,6 +5354,8 @@ retry: out: mddev_unlock(mddev); + if (action == ACTION_RESHAPE) + mddev_resume(mddev); return ret; } |
