md: when a level change reduces the number of devices, remove the excess.
When an array is changed from RAID6 to RAID5, fewer drives are needed. So any device that is made superfluous by the level conversion must be marked as not-active. For the RAID6->RAID5 conversion, this will be a drive which only has 'Q' blocks on it. Cc: stable@kernel.org Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
ac5e7113e7
commit
3a981b03f3
|
@ -2695,6 +2695,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
|
||||||
ssize_t rv = len;
|
ssize_t rv = len;
|
||||||
struct mdk_personality *pers;
|
struct mdk_personality *pers;
|
||||||
void *priv;
|
void *priv;
|
||||||
|
mdk_rdev_t *rdev;
|
||||||
|
|
||||||
if (mddev->pers == NULL) {
|
if (mddev->pers == NULL) {
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
|
@ -2774,6 +2775,12 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
|
||||||
mddev_suspend(mddev);
|
mddev_suspend(mddev);
|
||||||
mddev->pers->stop(mddev);
|
mddev->pers->stop(mddev);
|
||||||
module_put(mddev->pers->owner);
|
module_put(mddev->pers->owner);
|
||||||
|
/* Invalidate devices that are now superfluous */
|
||||||
|
list_for_each_entry(rdev, &mddev->disks, same_set)
|
||||||
|
if (rdev->raid_disk >= mddev->raid_disks) {
|
||||||
|
rdev->raid_disk = -1;
|
||||||
|
clear_bit(In_sync, &rdev->flags);
|
||||||
|
}
|
||||||
mddev->pers = pers;
|
mddev->pers = pers;
|
||||||
mddev->private = priv;
|
mddev->private = priv;
|
||||||
strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
|
strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
|
||||||
|
|
Loading…
Reference in New Issue