]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Improve partition table code.
[thirdparty/mdadm.git] / Create.c
index c96b31950bc95c5c119e2de95906dddd1e726c5c..909ac5da5fcba1fad615e402a4d9da503edee9bd 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -195,7 +195,7 @@ int Create(struct supertype *st, char *mddev,
        if (st && st->ss->external && sparedisks) {
                fprintf(stderr,
                        Name ": This metadata type does not support "
-                       "spare disks are create time\n");
+                       "spare disks at create time\n");
                return 1;
        }
        if (subdevs > raiddisks+sparedisks) {
@@ -234,8 +234,15 @@ int Create(struct supertype *st, char *mddev,
        case 10:
        case 6:
        case 0:
-       case LEVEL_LINEAR: /* linear */
                if (chunk == 0) {
+                       chunk = 512;
+                       if (verbose > 0)
+                               fprintf(stderr, Name ": chunk size defaults to 512K\n");
+               }
+               break;
+       case LEVEL_LINEAR:
+               /* a chunksize of zero 0s perfectly valid (and preferred) since 2.6.16 */
+               if (get_linux_version() < 2006016 && chunk == 0) {
                        chunk = 64;
                        if (verbose > 0)
                                fprintf(stderr, Name ": chunk size defaults to 64K\n");
@@ -325,7 +332,7 @@ int Create(struct supertype *st, char *mddev,
                                                       raiddisks,
                                                       chunk, size*2, dname,
                                                       &freesize,
-                                                      verbose > 0)) {
+                                                      verbose >= 0)) {
 
                                fprintf(stderr,
                                        Name ": %s is not suitable for "
@@ -368,6 +375,28 @@ int Create(struct supertype *st, char *mddev,
                        warn |= check_ext2(fd, dname);
                        warn |= check_reiser(fd, dname);
                        warn |= check_raid(fd, dname);
+                       if (strcmp(st->ss->name, "1.x") == 0 &&
+                           st->minor_version >= 1)
+                               /* metadata at front */
+                               warn |= check_partitions(fd, dname, 0);
+                       else if (level == 1 || level == LEVEL_CONTAINER)
+                               /* partitions could be meaningful */
+                               warn |= check_partitions(fd, dname, freesize*2);
+                       else
+                               /* partitions cannot be meaningful */
+                               warn |= check_partitions(fd, dname, 0);
+                       if (strcmp(st->ss->name, "1.x") == 0 &&
+                           st->minor_version >= 1 &&
+                           did_default &&
+                           level == 1 &&
+                           (warn & 1024) == 0) {
+                               warn |= 1024;
+                               fprintf(stderr, Name ": Note: this array has metadata at the start and\n"
+                                       "    may not be suitable as a boot device.  If you plan to\n"
+                                       "    store '/boot' on this device please ensure that\n"
+                                       "    your boot-loader understands md/v1.x metadata, or use\n"
+                                       "    --metadata=0.90\n");
+                       }
                        close(fd);
                }
        }
@@ -509,7 +538,7 @@ int Create(struct supertype *st, char *mddev,
             assume_clean
                ) {
                info.array.state = 1; /* clean, but one+ drive will be missing*/
-               info.resync_start = ~0ULL;
+               info.resync_start = MaxSector;
        } else {
                info.array.state = 0; /* not clean, but no errors */
                info.resync_start = 0;