diff options
author | NeilBrown <neilb@suse.de> | 2009-11-13 01:40:51 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-11-13 01:40:51 -0500 |
commit | 7ef90146a14c2bb1de2e22399f147ebec5b74f0b (patch) | |
tree | ab0e97fb85814f174ed5ec0645057bb65dd4bb1d /drivers/md | |
parent | 0261cd9f1cb42fa44ece314d27868d83742bdf03 (diff) |
Don't unconditionally set in_sync on newly added device in raid5_reshape
When a reshape finds that it can add spare devices into the array,
those devices might already be 'in_sync' if they are beyond the old
size of the array, or they might not if they are within the array.
The first case happens when we change an N-drive RAID5 to an
N+1-drive RAID5.
The second happens when we convert an N-drive RAID5 to an
N+1-drive RAID6.
So set the flag more carefully.
Also, ->recovery_offset is only meaningful when the flag is clear,
so only set it in that case.
This change needs the preceding two to ensure that the non-in_sync
device doesn't get evicted from the array when it is stopped, in the
case where v0.90 metadata is used.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index dcce204b6c73..ab40529bdabe 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -5361,9 +5361,11 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
5361 | !test_bit(Faulty, &rdev->flags)) { | 5361 | !test_bit(Faulty, &rdev->flags)) { |
5362 | if (raid5_add_disk(mddev, rdev) == 0) { | 5362 | if (raid5_add_disk(mddev, rdev) == 0) { |
5363 | char nm[20]; | 5363 | char nm[20]; |
5364 | set_bit(In_sync, &rdev->flags); | 5364 | if (rdev->raid_disk >= conf->previous_raid_disks) |
5365 | set_bit(In_sync, &rdev->flags); | ||
5366 | else | ||
5367 | rdev->recovery_offset = 0; | ||
5365 | added_devices++; | 5368 | added_devices++; |
5366 | rdev->recovery_offset = 0; | ||
5367 | sprintf(nm, "rd%d", rdev->raid_disk); | 5369 | sprintf(nm, "rd%d", rdev->raid_disk); |
5368 | if (sysfs_create_link(&mddev->kobj, | 5370 | if (sysfs_create_link(&mddev->kobj, |
5369 | &rdev->kobj, nm)) | 5371 | &rdev->kobj, nm)) |