md: don't insist on valid event count for spare devices.
authorNeilBrown <neilb@suse.de>
Tue, 18 May 2010 00:17:09 +0000 (10:17 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 18 May 2010 05:28:01 +0000 (15:28 +1000)
Devices which know that they are spares do not really need to have
an event count that matches the rest of the array, so there are no
data-in-sync issues. It is enough that the uuid matches.
So remove the requirement that the event count is up-to-date.

We currently still write out and event count on spares, but this
allows us in a year or 3 to stop doing that completely.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index 9ef21d9b8e27394e40c35454ecfea6c75997c443..26b3d2879d93d82cb05a73a442c158a6e12d35c9 100644 (file)
@@ -1070,10 +1070,13 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                                mddev->bitmap_info.default_offset;
 
        } else if (mddev->pers == NULL) {
-               /* Insist on good event counter while assembling */
+               /* Insist on good event counter while assembling, except
+                * for spares (which don't need an event count) */
                ++ev1;
-               if (ev1 < mddev->events) 
-                       return -EINVAL;
+               if (sb->disks[rdev->desc_nr].state & (
+                           (1<<MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE)))
+                       if (ev1 < mddev->events) 
+                               return -EINVAL;
        } else if (mddev->bitmap) {
                /* if adding to array with a bitmap, then we can accept an
                 * older device ... but not too old.
@@ -1469,10 +1472,14 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
                }
 
        } else if (mddev->pers == NULL) {
-               /* Insist of good event counter while assembling */
+               /* Insist of good event counter while assembling, except for
+                * spares (which don't need an event count) */
                ++ev1;
-               if (ev1 < mddev->events)
-                       return -EINVAL;
+               if (rdev->desc_nr >= 0 &&
+                   rdev->desc_nr < le32_to_cpu(sb->max_dev) &&
+                   le16_to_cpu(sb->dev_roles[rdev->desc_nr]) < 0xfffe)
+                       if (ev1 < mddev->events)
+                               return -EINVAL;
        } else if (mddev->bitmap) {
                /* If adding to array with a bitmap, then we can accept an
                 * older device, but not too old.