md/raid5: don't start reshape when recovery or replace is in progress
authorYu Kuai <yukuai3@huawei.com>
Mon, 29 May 2023 13:34:10 +0000 (21:34 +0800)
committerSong Liu <song@kernel.org>
Tue, 13 Jun 2023 22:25:41 +0000 (15:25 -0700)
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
drivers/md/raid5.c

index 7e2bbcf..f8bc74e 100644 (file)
@@ -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))