OSDN Git Service

md: don't insist on valid event count for spare devices.
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / md / md.c
index 9ef21d9..26b3d28 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.