aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-11-13 01:40:51 -0500
committerNeilBrown <neilb@suse.de>2009-11-13 01:40:51 -0500
commit7ef90146a14c2bb1de2e22399f147ebec5b74f0b (patch)
treeab0e97fb85814f174ed5ec0645057bb65dd4bb1d /drivers/md/raid5.c
parent0261cd9f1cb42fa44ece314d27868d83742bdf03 (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/raid5.c')
-rw-r--r--drivers/md/raid5.c6
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))