]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
imsm: reverse swapped arguments to posix_memalign in imsm_prepare_update
[thirdparty/mdadm.git] / Create.c
index a66ed0ce2f01e50dd61ff94ee43bd866917f2df7..09df0b8843c7cd97d12744d5cb6ad73aeea468b1 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -80,6 +80,7 @@ int Create(struct supertype *st, char *mddev,
        int did_default = 0;
        unsigned long safe_mode_delay = 0;
        char chosen_name[1024];
+       struct map_ent *map = NULL;
 
        int major_num = BITMAP_MAJOR_HI;
 
@@ -312,7 +313,7 @@ int Create(struct supertype *st, char *mddev,
                }
 
                if (size && freesize < size) {
-                       fprintf(stderr, Name ": %s is smaller that given size."
+                       fprintf(stderr, Name ": %s is smaller than given size."
                                " %lluK < %lluK + metadata\n",
                                dname, freesize, size);
                        fail = 1;
@@ -388,7 +389,8 @@ int Create(struct supertype *st, char *mddev,
         * as missing, so that a reconstruct happens (faster than re-parity)
         * FIX: Can we do this for raid6 as well?
         */
-       if (assume_clean==0 && force == 0 && first_missing >= raiddisks) {
+       if (st->ss->external == 0 &&
+           assume_clean==0 && force == 0 && first_missing >= raiddisks) {
                switch ( level ) {
                case 4:
                case 5:
@@ -422,9 +424,11 @@ int Create(struct supertype *st, char *mddev,
        }
 
        /* We need to create the device */
+       map_lock(&map);
        mdfd = create_mddev(mddev, name, autof, LOCAL, chosen_name);
        if (mdfd < 0)
                return 1;
+       mddev = chosen_name;
 
        vers = md_get_version(mdfd);
        if (vers < 9000) {
@@ -561,8 +565,9 @@ int Create(struct supertype *st, char *mddev,
                                " %s metadata\n", info.text_version);
        }
 
-       map_update(NULL, fd2devnum(mdfd), info.text_version,
+       map_update(&map, fd2devnum(mdfd), info.text_version,
                   info.uuid, chosen_name);
+       map_unlock(&map);
 
        if (bitmap_file && vers < 9003) {
                major_num = BITMAP_MAJOR_HOSTENDIAN;
@@ -700,8 +705,9 @@ int Create(struct supertype *st, char *mddev,
                                inf->disk.minor = minor(stb.st_rdev);
 
                                remove_partitions(fd);
-                               st->ss->add_to_super(st, &inf->disk,
-                                                    fd, dv->devname);
+                               if (st->ss->add_to_super(st, &inf->disk,
+                                                        fd, dv->devname))
+                                       goto abort;
                                st->ss->getinfo_super(st, inf);
                                safe_mode_delay = inf->safe_mode_delay;
 
@@ -775,6 +781,7 @@ int Create(struct supertype *st, char *mddev,
                        ping_monitor(devnum2devname(st->container_dev));
                        close(container_fd);
                }
+               wait_for(chosen_name);
        } else {
                fprintf(stderr, Name ": not starting array - not enough devices.\n");
        }