From: NeilBrown <neilb@suse.de>
Git-commit: 63aced61023a054825ffd6e33ac1ab99036dadd2
Date: Tue, 22 May 2012 10:29:08 +1000
Subject: [PATCH] md/raid10: Remove extras after reshape to smaller number of
 devices.
Patch-mainline: 3.5
References: bnc#763212

When a reshape which reduced the number of devices finishes
we must remove the extra devices.

So ensure  that raid10_remove_disk won't try to keep them, and
have raid10_finish_reshape clear the 'in_sync' flag.  Then
remove_and_add_spares will be able to remove them.

Reported-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Neil Brown <neilb@suse.de>

---
 drivers/md/raid10.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

--- linux-3.0-SLE11-SP3.orig/drivers/md/raid10.c
+++ linux-3.0-SLE11-SP3/drivers/md/raid10.c
@@ -1353,6 +1353,7 @@ static int raid10_remove_disk(mddev_t *m
 		 */
 		if (!test_bit(Faulty, &rdev->flags) &&
 		    !mddev->recovery_disabled &&
+		    number < conf->geo.raid_disks &&
 		    enough(conf, -1)) {
 			err = -EBUSY;
 			goto abort;
@@ -3640,6 +3641,15 @@ static void raid10_finish_reshape(mddev_
 		mddev->resync_max_sectors = size;
 		set_capacity(mddev->gendisk, mddev->array_sectors);
 		revalidate_disk(mddev->gendisk);
+	} else {
+		int d;
+		for (d = conf->geo.raid_disks ;
+		     d < conf->geo.raid_disks - mddev->delta_disks;
+		     d++) {
+			mdk_rdev_t *rdev = conf->mirrors[d].rdev;
+			if (rdev)
+				clear_bit(In_sync, &rdev->flags);
+		}
 	}
 	mddev->layout = mddev->new_layout;
 	mddev->chunk_sectors = 1 << conf->geo.chunk_shift;
