Skip to content

Commit

Permalink
md/raid5: don't include 'spare' drives when reshaping to fewer devices.
Browse files Browse the repository at this point in the history
There are few situations where it would make any sense to add a spare
when reducing the number of devices in an array, but it is
conceivable:  A 6 drive RAID6 with two missing devices could be
reshaped to a 5 drive RAID6, and a spare could become available
just in time for the reshape, but not early enough to have been
recovered first.  'freezing' recovery can make this easy to
do without any races.

However doing such a thing is a bad idea.  md will not record the
partially-recovered state of the 'spare' and when the reshape
finished it will think that the spare is still spare.
Easiest way to avoid this confusion is to simply disallow it.

Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
NeilBrown committed Jun 24, 2010
1 parent 2f11588 commit 3424bf6
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -5526,8 +5526,13 @@ static int raid5_start_reshape(mddev_t *mddev)

/* Add some new drives, as many as will fit.
* We know there are enough to make the newly sized array work.
* Don't add devices if we are reducing the number of
* devices in the array. This is because it is not possible
* to correctly record the "partially reconstructed" state of
* such devices during the reshape and confusion could result.
*/
list_for_each_entry(rdev, &mddev->disks, same_set)
if (mddev->delta_disks >= 0)
list_for_each_entry(rdev, &mddev->disks, same_set)
if (rdev->raid_disk < 0 &&
!test_bit(Faulty, &rdev->flags)) {
if (raid5_add_disk(mddev, rdev) == 0) {
Expand All @@ -5549,7 +5554,7 @@ static int raid5_start_reshape(mddev_t *mddev)
}

/* When a reshape changes the number of devices, ->degraded
* is measured against the large of the pre and post number of
* is measured against the larger of the pre and post number of
* devices.*/
if (mddev->delta_disks > 0) {
spin_lock_irqsave(&conf->device_lock, flags);
Expand Down

0 comments on commit 3424bf6

Please sign in to comment.