md: allow v0.91 metadata to record devices as being active but not in-sync.
This is a combination that didn't really make sense before. However when a reshape is converting e.g. raid5 -> raid6, the extra device is not fully in-sync, but is certainly active and contains important data. So allow that start to be meaningful and in particular get the 'recovery_offset' value (which is needed for any non-in-sync active device) from the reshape_position. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
5e8651060c
commit
0261cd9f1c
1 changed files with 25 additions and 6 deletions
|
@ -944,6 +944,14 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
|
|||
desc->raid_disk < mddev->raid_disks */) {
|
||||
set_bit(In_sync, &rdev->flags);
|
||||
rdev->raid_disk = desc->raid_disk;
|
||||
} else if (desc->state & (1<<MD_DISK_ACTIVE)) {
|
||||
/* active but not in sync implies recovery up to
|
||||
* reshape position. We don't know exactly where
|
||||
* that is, so set to zero for now */
|
||||
if (mddev->minor_version >= 91) {
|
||||
rdev->recovery_offset = 0;
|
||||
rdev->raid_disk = desc->raid_disk;
|
||||
}
|
||||
}
|
||||
if (desc->state & (1<<MD_DISK_WRITEMOSTLY))
|
||||
set_bit(WriteMostly, &rdev->flags);
|
||||
|
@ -1032,8 +1040,19 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
|
|||
list_for_each_entry(rdev2, &mddev->disks, same_set) {
|
||||
mdp_disk_t *d;
|
||||
int desc_nr;
|
||||
if (rdev2->raid_disk >= 0 && test_bit(In_sync, &rdev2->flags)
|
||||
&& !test_bit(Faulty, &rdev2->flags))
|
||||
int is_active = test_bit(In_sync, &rdev2->flags);
|
||||
|
||||
if (rdev2->raid_disk >= 0 &&
|
||||
sb->minor_version >= 91)
|
||||
/* we have nowhere to store the recovery_offset,
|
||||
* but if it is not below the reshape_position,
|
||||
* we can piggy-back on that.
|
||||
*/
|
||||
is_active = 1;
|
||||
if (rdev2->raid_disk < 0 ||
|
||||
test_bit(Faulty, &rdev2->flags))
|
||||
is_active = 0;
|
||||
if (is_active)
|
||||
desc_nr = rdev2->raid_disk;
|
||||
else
|
||||
desc_nr = next_spare++;
|
||||
|
@ -1043,16 +1062,16 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
|
|||
d->number = rdev2->desc_nr;
|
||||
d->major = MAJOR(rdev2->bdev->bd_dev);
|
||||
d->minor = MINOR(rdev2->bdev->bd_dev);
|
||||
if (rdev2->raid_disk >= 0 && test_bit(In_sync, &rdev2->flags)
|
||||
&& !test_bit(Faulty, &rdev2->flags))
|
||||
if (is_active)
|
||||
d->raid_disk = rdev2->raid_disk;
|
||||
else
|
||||
d->raid_disk = rdev2->desc_nr; /* compatibility */
|
||||
if (test_bit(Faulty, &rdev2->flags))
|
||||
d->state = (1<<MD_DISK_FAULTY);
|
||||
else if (test_bit(In_sync, &rdev2->flags)) {
|
||||
else if (is_active) {
|
||||
d->state = (1<<MD_DISK_ACTIVE);
|
||||
d->state |= (1<<MD_DISK_SYNC);
|
||||
if (test_bit(In_sync, &rdev2->flags))
|
||||
d->state |= (1<<MD_DISK_SYNC);
|
||||
active++;
|
||||
working++;
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue