mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
md/raid5: don't start reshape when recovery or replace is in progress
When recovery is interrupted (reboot, etc.) check for MD_RECOVERY_RUNNING is not enough to tell recovery is in progress. Also check recovery_cp before starting reshape. Signed-off-by: Yu Kuai <yukuai3@huawei.com> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20230529133410.2125914-1-yukuai1@huaweicloud.com
This commit is contained in:
@@ -8525,6 +8525,7 @@ static int raid5_start_reshape(struct mddev *mddev)
|
||||
struct r5conf *conf = mddev->private;
|
||||
struct md_rdev *rdev;
|
||||
int spares = 0;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
||||
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
|
||||
@@ -8536,6 +8537,13 @@ static int raid5_start_reshape(struct mddev *mddev)
|
||||
if (has_failed(conf))
|
||||
return -EINVAL;
|
||||
|
||||
/* raid5 can't handle concurrent reshape and recovery */
|
||||
if (mddev->recovery_cp < MaxSector)
|
||||
return -EBUSY;
|
||||
for (i = 0; i < conf->raid_disks; i++)
|
||||
if (rdev_mdlock_deref(mddev, conf->disks[i].replacement))
|
||||
return -EBUSY;
|
||||
|
||||
rdev_for_each(rdev, mddev) {
|
||||
if (!test_bit(In_sync, &rdev->flags)
|
||||
&& !test_bit(Faulty, &rdev->flags))
|
||||
|
||||
Reference in New Issue
Block a user