]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Create/grow: improve checks on number of devices.
authorNeilBrown <neilb@suse.de>
Wed, 1 Dec 2010 03:51:27 +0000 (14:51 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 10 Mar 2011 06:18:26 +0000 (17:18 +1100)
Check on upper limit of number of devices was in the wrong place.
Result was could not create array with more than 27 devices without
explicitly setting metadata, even though default metadata allows more.

Fixed, and also perform check when growing an array.

Signed-off-by: NeilBrown <neilb@suse.de>
Create.c
Grow.c
mdadm.c

index 2bf7ebe2dfac380e2c7abe38ab2c7dce38360d50..daf64d7074ca5d4809a8290091a9af2b00eac68d 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -66,11 +66,13 @@ static int default_layout(struct supertype *st, int level, int verbose)
 
 
 int Create(struct supertype *st, char *mddev,
-          int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
+          int chunk, int level, int layout, unsigned long long size,
+          int raiddisks, int sparedisks,
           char *name, char *homehost, int *uuid,
           int subdevs, mddev_dev_t devlist,
           int runstop, int verbose, int force, int assume_clean,
-          char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof)
+          char *bitmap_file, int bitmap_chunk, int write_behind,
+          int delay, int autof)
 {
        /*
         * Create a new raid array.
@@ -404,6 +406,12 @@ int Create(struct supertype *st, char *mddev,
                        close(fd);
                }
        }
+       if (raiddisks + sparedisks > st->max_devs) {
+               fprintf(stderr, Name ": Too many devices:"
+                       " %s metadata only supports %d\n",
+                       st->ss->name, st->max_devs);
+               return 1;
+       }
        if (have_container)
                info.array.working_disks = raiddisks;
        if (fail) {
diff --git a/Grow.c b/Grow.c
index bcd77ac90f89d3e56293f1390a00fa9a9aa22995..bcb84a882bb995a189082b2026aba01352459f77 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -831,6 +831,13 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                 */
                st = super_by_fd(fd);
 
+               if (raid_disks > st->max_devs) {
+                       fprintf(stderr, Name ": Cannot increase raid-disks on "
+                               "this array beyond %d\n", st->max_devs);
+                       rv = 1;
+                       break;
+               }
+
                /*
                 * There are three possibilities.
                 * 1/ The array will shrink.
diff --git a/mdadm.c b/mdadm.c
index 08e8ea4e0052950ce4f695a633318a9eb4721c10..78a4d3d6d5c52ebfce7708fedb8c573083a9b3e3 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -46,7 +46,6 @@ int main(int argc, char *argv[])
        int layout = UnSet;
        char *layout_str = NULL;
        int raiddisks = 0;
-       int max_disks = MD_SB_DISKS; /* just a default */
        int sparedisks = 0;
        struct mddev_ident_s ident;
        char *configfile = NULL;
@@ -369,7 +368,6 @@ int main(int argc, char *argv[])
                                fprintf(stderr, Name ": unrecognised metadata identifier: %s\n", optarg);
                                exit(2);
                        }
-                       max_disks = ss->max_devs;
                        continue;
 
                case O(MANAGE,'W'):
@@ -1055,11 +1053,6 @@ int main(int argc, char *argv[])
        }
 
        if (raiddisks) {
-               if (raiddisks > max_disks) {
-                       fprintf(stderr, Name ": invalid number of raid devices: %d\n",
-                               raiddisks);
-                       exit(2);
-               }
                if (raiddisks == 1 &&  !force && level != -5) {
                        fprintf(stderr, Name ": '1' is an unusual number of drives for an array, so it is probably\n"
                                "     a mistake.  If you really mean it you will need to specify --force before\n"
@@ -1067,13 +1060,6 @@ int main(int argc, char *argv[])
                        exit(2);
                }
        }
-       if (sparedisks) {
-               if ( sparedisks > max_disks - raiddisks) {
-                       fprintf(stderr, Name ": invalid number of spare-devices: %d\n",
-                               sparedisks);
-                       exit(2);
-               }
-       }
 
        if (homehost == NULL)
                homehost = conf_get_homehost(&require_homehost);