|
@@ -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 {
|