]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Disk removal support for Raid10->Raid0 takeover
[thirdparty/mdadm.git] / Create.c
index 337040c22d9c48d184a5d06f37e5458ca0df5312..4a79fb04e461ec5ae5ed1d8c824c3eb78844679b 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -31,8 +31,8 @@ static int default_layout(struct supertype *st, int level, int verbose)
 {
        int layout = UnSet;
 
-       if (st && st->ss->default_layout)
-               layout = st->ss->default_layout(level);
+       if (st && st->ss->default_geometry)
+               st->ss->default_geometry(st, &level, &layout, NULL);
 
        if (layout == UnSet)
                switch(level) {
@@ -68,7 +68,7 @@ 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,
           char *name, char *homehost, int *uuid,
-          int subdevs, mddev_dev_t devlist,
+          int subdevs, struct mddev_dev *devlist,
           int runstop, int verbose, int force, int assume_clean,
           char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof)
 {
@@ -93,7 +93,7 @@ int Create(struct supertype *st, char *mddev,
        char *mindisc = NULL;
        char *maxdisc = NULL;
        int dnum;
-       mddev_dev_t dv;
+       struct mddev_dev *dv;
        int fail=0, warn=0;
        struct stat stb;
        int first_missing = subdevs * 2;
@@ -120,15 +120,8 @@ int Create(struct supertype *st, char *mddev,
        int major_num = BITMAP_MAJOR_HI;
 
        memset(&info, 0, sizeof(info));
-
-       if (level == UnSet) {
-               /* "ddf" and "imsm" metadata only supports one level - should possibly
-                * push this into metadata handler??
-                */
-               if (st && (st->ss == &super_ddf || st->ss == &super_imsm))
-                       level = LEVEL_CONTAINER;
-       }
-
+       if (level == UnSet && st && st->ss->default_geometry)
+               st->ss->default_geometry(st, &level, NULL, NULL);
        if (level == UnSet) {
                fprintf(stderr,
                        Name ": a RAID level is needed to create an array.\n");
@@ -169,15 +162,15 @@ int Create(struct supertype *st, char *mddev,
                    inf.raid_disks == 0) {
                        /* yep, looks like a container */
                        if (st) {
-                               rv = st->ss->load_super(st, fd,
-                                                       devlist->devname);
+                               rv = st->ss->load_container(st, fd,
+                                                           devlist->devname);
                                if (rv == 0)
                                        have_container = 1;
                        } else {
-                               st = guess_super(fd);
+                               st = super_by_fd(fd, NULL);
                                if (st && !(rv = st->ss->
-                                           load_super(st, fd,
-                                                      devlist->devname)))
+                                           load_container(st, fd,
+                                                          devlist->devname)))
                                        have_container = 1;
                                else
                                        st = NULL;
@@ -235,11 +228,9 @@ int Create(struct supertype *st, char *mddev,
        case 6:
        case 0:
                if (chunk == 0) {
-                       if (st && st->ss->default_chunk)
-                               chunk = st->ss->default_chunk(st);
-
+                       if (st && st->ss->default_geometry)
+                               st->ss->default_geometry(st, NULL, NULL, &chunk);
                        chunk = chunk ? : 512;
-
                        if (verbose > 0)
                                fprintf(stderr, Name ": chunk size defaults to %dK\n", chunk);
                }
@@ -735,7 +726,7 @@ int Create(struct supertype *st, char *mddev,
        infos = malloc(sizeof(*infos) * total_slots);
 
        for (pass=1; pass <=2 ; pass++) {
-               mddev_dev_t moved_disk = NULL; /* the disk that was moved out of the insert point */
+               struct mddev_dev *moved_disk = NULL; /* the disk that was moved out of the insert point */
 
                for (dnum=0, dv = devlist ; dv ;
                     dv=(dv->next)?(dv->next):moved_disk, dnum++) {