]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
RAID-6 check standalone fix component list parsing
[thirdparty/mdadm.git] / Create.c
index 2e3d7235cf1094152a1ea1892cdc8ffd80865828..9ee09280e4c29aa74427680b43b89c786a55dadc 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -266,10 +266,18 @@ int Create(struct supertype *st, char *mddev,
                                              &chunk, size*2, NULL, &newsize, verbose>=0))
                return 1;
 
-       if (chunk) {
+       if (chunk && chunk != UnSet) {
                newsize &= ~(unsigned long long)(chunk*2 - 1);
-               size &= ~(unsigned long long)(chunk - 1);
+               if (do_default_chunk) {
+                       /* default chunk was just set */
+                       if (verbose > 0)
+                               fprintf(stderr, Name ": chunk size "
+                                       "defaults to %dK\n", chunk);
+                       size &= ~(unsigned long long)(chunk - 1);
+                       do_default_chunk = 0;
+               }
        }
+
        if (size == 0) {
                size = newsize / 2;
                if (size && verbose > 0)
@@ -316,7 +324,7 @@ int Create(struct supertype *st, char *mddev,
                                                 verbose > 0)) {
                                        free(st);
                                        st = NULL;
-                                       chunk = do_default_chunk ? 0 : chunk;
+                                       chunk = do_default_chunk ? UnSet : chunk;
                                }
                        }
 
@@ -346,16 +354,19 @@ int Create(struct supertype *st, char *mddev,
                                continue;
                        }
                }
-               if (verbose > 0 && do_default_chunk) {
-                       do_default_chunk = 0;
-                       fprintf(stderr, Name ": chunk size "
-                               "defaults to %dK\n", chunk);
-               }
 
                freesize /= 2; /* convert to K */
-               if (chunk) {
+               if (chunk && chunk != UnSet) {
                        /* round to chunk size */
                        freesize = freesize & ~(chunk-1);
+                       if (do_default_chunk) {
+                               /* default chunk was just set */
+                               if (verbose > 0)
+                                       fprintf(stderr, Name ": chunk size "
+                                               "defaults to %dK\n", chunk);
+                               size &= ~(unsigned long long)(chunk - 1);
+                               do_default_chunk = 0;
+                       }
                }
 
                if (size && freesize < size) {
@@ -387,14 +398,14 @@ int Create(struct supertype *st, char *mddev,
                        if (strcmp(st->ss->name, "1.x") == 0 &&
                            st->minor_version >= 1)
                                /* metadata at front */
-                               warn |= check_partitions(fd, dname, 0);
+                               warn |= check_partitions(fd, dname, 0, 0);
                        else if (level == 1 || level == LEVEL_CONTAINER
                                    || (level == 0 && raiddisks == 1))
                                /* partitions could be meaningful */
-                               warn |= check_partitions(fd, dname, freesize*2);
+                               warn |= check_partitions(fd, dname, freesize*2, size*2);
                        else
                                /* partitions cannot be meaningful */
-                               warn |= check_partitions(fd, dname, 0);
+                               warn |= check_partitions(fd, dname, 0, 0);
                        if (strcmp(st->ss->name, "1.x") == 0 &&
                            st->minor_version >= 1 &&
                            did_default &&
@@ -929,7 +940,7 @@ int Create(struct supertype *st, char *mddev,
                        if (need_mdmon)
                                start_mdmon(st->container_dev);
 
-                       ping_monitor(devnum2devname(st->container_dev));
+                       ping_monitor_by_id(st->container_dev);
                        close(container_fd);
                }
                wait_for(chosen_name, mdfd);