dm raid: restructure parse_raid_params
authorJonathan E Brassow <jbrassow@redhat.com>
Fri, 27 Jul 2012 14:08:04 +0000 (15:08 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Fri, 27 Jul 2012 14:08:04 +0000 (15:08 +0100)
In preparation for RAID10 addition to dm-raid, we change an 'if' conditional
to a 'switch' conditional to make it easier to see what is being checked for
each RAID type.

Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-raid.c

index 858a8b70811cde68890eac2f106cb64608768b56..1717ed33dd7f6cbe8d135de07861eae207c1ad6d 100644 (file)
@@ -430,13 +430,28 @@ static int parse_raid_params(struct raid_set *rs, char **argv,
 
                if (!strcasecmp(key, "rebuild")) {
                        rebuild_cnt++;
-                       if (((rs->raid_type->level != 1) &&
-                            (rebuild_cnt > rs->raid_type->parity_devs)) ||
-                           ((rs->raid_type->level == 1) &&
-                            (rebuild_cnt > (rs->md.raid_disks - 1)))) {
-                               rs->ti->error = "Too many rebuild devices specified for given RAID type";
+
+                       switch (rs->raid_type->level) {
+                       case 1:
+                               if (rebuild_cnt >= rs->md.raid_disks) {
+                                       rs->ti->error = "Too many rebuild devices specified";
+                                       return -EINVAL;
+                               }
+                               break;
+                       case 4:
+                       case 5:
+                       case 6:
+                               if (rebuild_cnt > rs->raid_type->parity_devs) {
+                                       rs->ti->error = "Too many rebuild devices specified for given RAID type";
+                                       return -EINVAL;
+                               }
+                               break;
+                       default:
+                               DMERR("The rebuild parameter is not supported for %s", rs->raid_type->name);
+                               rs->ti->error = "Rebuild not supported for this RAID type";
                                return -EINVAL;
                        }
+
                        if (value > rs->md.raid_disks) {
                                rs->ti->error = "Invalid rebuild index given";
                                return -EINVAL;