]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Fix --no-error in test script
[thirdparty/mdadm.git] / Create.c
index 3e85785468a336f7f54720b53e34c7367848e9c9..58d106877315828a88245cacaa967e2fffff280f 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -280,6 +280,13 @@ int Create(struct supertype *st, char *mddev,
 
        if (size == 0) {
                size = newsize / 2;
+               if (level == 1)
+                       /* If this is ever reshaped to RAID5, we will
+                        * need a chunksize.  So round it off a bit
+                        * now just to be safe
+                        */
+                       size &= ~(64ULL-1);
+
                if (size && verbose > 0)
                        fprintf(stderr, Name ": setting size to %lluK\n",
                                (unsigned long long)size);
@@ -371,7 +378,7 @@ int Create(struct supertype *st, char *mddev,
                                did_default = 1;
                } else {
                        if (do_default_layout)
-                               layout = default_layout(st, level, verbose);
+                               layout = default_layout(st, level, 0);
                        if (!st->ss->validate_geometry(st, level, layout,
                                                       raiddisks,
                                                       &chunk, size*2, dname,
@@ -482,6 +489,12 @@ int Create(struct supertype *st, char *mddev,
                                return 1;
                        }
                        size = minsize;
+                       if (level == 1)
+                               /* If this is ever reshaped to RAID5, we will
+                                * need a chunksize.  So round it off a bit
+                                * now just to be safe
+                                */
+                               size &= ~(64ULL-1);
                        if (verbose > 0)
                                fprintf(stderr, Name ": size set to %lluK\n", size);
                }
@@ -558,6 +571,18 @@ int Create(struct supertype *st, char *mddev,
                map_unlock(&map);
                return 1;
        }
+       /* verify if chosen_name is not in use,
+        * it could be in conflict with already existing device
+        * e.g. container, array
+        */
+       if (strncmp(chosen_name, "/dev/md/", 8) == 0
+           && map_by_name(&map, chosen_name+8) != NULL) {
+               fprintf(stderr, Name ": Array name %s is in use already.\n",
+                       chosen_name);
+               close(mdfd);
+               map_unlock(&map);
+               return 1;
+       }
        mddev = chosen_name;
 
        vers = md_get_version(mdfd);
@@ -790,6 +815,10 @@ int Create(struct supertype *st, char *mddev,
        }
 
        infos = malloc(sizeof(*infos) * total_slots);
+       if (!infos) {
+               fprintf(stderr, Name ": Unable to allocate memory\n");
+               goto abort;
+       }
 
        for (pass=1; pass <=2 ; pass++) {
                struct mddev_dev *moved_disk = NULL; /* the disk that was moved out of the insert point */
@@ -908,9 +937,6 @@ int Create(struct supertype *st, char *mddev,
                        }
 
                        if (st->ss->write_init_super(st)) {
-                               fprintf(stderr,
-                                       Name ": Failed to write metadata to %s\n",
-                                       dv->devname);
                                st->ss->free_super(st);
                                goto abort_locked;
                        }