dm raid: validate current raid sets redundancy
authorHeinz Mauelshagen <heinzm@redhat.com>
Wed, 13 Dec 2017 16:13:17 +0000 (17:13 +0100)
committerMike Snitzer <snitzer@redhat.com>
Wed, 13 Dec 2017 16:50:52 +0000 (11:50 -0500)
Verifying the current raid sets redundancy based on retrieved
superblock content has to use the superblock's raid level (e.g. raid0),
not the constructor requested one (e.g. raid10).

Using the requested raid level of raid10 lead to a "divide error"
on raid0 which defines data copies divided by to be zero.

Also check for bogus data copies.

Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-raid.c

index 764baa9665bbfc9d550a61ae541799097e211f62..b82b7095a67190196e6ca14f287a09983661d743 100644 (file)
@@ -1007,7 +1007,7 @@ static int validate_raid_redundancy(struct raid_set *rs)
                    !rs->dev[i].rdev.sb_page)
                        rebuild_cnt++;
 
-       switch (rs->raid_type->level) {
+       switch (rs->md.level) {
        case 0:
                break;
        case 1:
@@ -1022,6 +1022,11 @@ static int validate_raid_redundancy(struct raid_set *rs)
                break;
        case 10:
                copies = raid10_md_layout_to_copies(rs->md.new_layout);
+               if (copies < 2) {
+                       DMERR("Bogus raid10 data copies < 2!");
+                       return -EINVAL;
+               }
+
                if (rebuild_cnt < copies)
                        break;