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>

NeilBrown 3a981b03 ac5e7113

+7
+7
drivers/md/md.c
··· 2695 ssize_t rv = len; 2696 struct mdk_personality *pers; 2697 void *priv; 2698 2699 if (mddev->pers == NULL) { 2700 if (len == 0) ··· 2775 mddev_suspend(mddev); 2776 mddev->pers->stop(mddev); 2777 module_put(mddev->pers->owner); 2778 mddev->pers = pers; 2779 mddev->private = priv; 2780 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
··· 2695 ssize_t rv = len; 2696 struct mdk_personality *pers; 2697 void *priv; 2698 + mdk_rdev_t *rdev; 2699 2700 if (mddev->pers == NULL) { 2701 if (len == 0) ··· 2774 mddev_suspend(mddev); 2775 mddev->pers->stop(mddev); 2776 module_put(mddev->pers->owner); 2777 + /* Invalidate devices that are now superfluous */ 2778 + list_for_each_entry(rdev, &mddev->disks, same_set) 2779 + if (rdev->raid_disk >= mddev->raid_disks) { 2780 + rdev->raid_disk = -1; 2781 + clear_bit(In_sync, &rdev->flags); 2782 + } 2783 mddev->pers = pers; 2784 mddev->private = priv; 2785 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));