md: Fix integrity registration error when no devices are capable
authorMartin K. Petersen <martin.petersen@oracle.com>
Tue, 29 Mar 2011 00:09:12 +0000 (20:09 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Mar 2011 00:53:29 +0000 (17:53 -0700)
We incorrectly returned -EINVAL when none of the devices in the array
had an integrity profile.  This in turn prevented mdadm from starting
the metadevice.  Fix this so we only return errors on mismatched
profiles and memory allocation failures.

Reported-by: Giacomo Catenazzi <cate@cateee.net>
Reported-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/md/md.c

index 06ecea751a39b8ec53935bcdfb331453d2e01b19..8b66e04c2ea6a833930ffbe57608911e16a494b2 100644 (file)
@@ -1777,12 +1777,6 @@ int md_integrity_register(mddev_t *mddev)
                        continue;
                if (rdev->raid_disk < 0)
                        continue;
-               /*
-                * If at least one rdev is not integrity capable, we can not
-                * enable data integrity for the md device.
-                */
-               if (!bdev_get_integrity(rdev->bdev))
-                       return -EINVAL;
                if (!reference) {
                        /* Use the first rdev as the reference */
                        reference = rdev;
@@ -1793,6 +1787,8 @@ int md_integrity_register(mddev_t *mddev)
                                rdev->bdev->bd_disk) < 0)
                        return -EINVAL;
        }
+       if (!reference || !bdev_get_integrity(reference->bdev))
+               return 0;
        /*
         * All component devices are integrity capable and have matching
         * profiles, register the common profile for the md device.