]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-ddf.c
fix: imsm: size must be in K for rounding to chunk
[thirdparty/mdadm.git] / super-ddf.c
index a97e05dea0c191b6ac31a1945d1a23789f5df38b..287fa7f8e1e958d96c8492ec222bb5ce3034ab4c 100644 (file)
@@ -772,12 +772,6 @@ static int load_super_ddf(struct supertype *st, int fd,
        struct ddf_super *super;
        int rv;
 
-#ifndef MDASSEMBLE
-       /* if 'fd' is a container, load metadata from all the devices */
-       if (load_super_ddf_all(st, fd, &st->sb, devname) == 0)
-               return 0;
-#endif
-
        if (get_dev_size(fd, devname, &dsize) == 0)
                return 1;
 
@@ -850,7 +844,6 @@ static int load_super_ddf(struct supertype *st, int fd,
                st->minor_version = 0;
                st->max_devs = 512;
        }
-       st->loaded_container = 0;
        return 0;
 
 }
@@ -1527,13 +1520,16 @@ static int update_super_ddf(struct supertype *st, struct mdinfo *info,
 //             if (info->vendor_is_local)
 //                     strcpy(ddf->controller.vendor_data, homehost);
                rv = -1;
-       } if (strcmp(update, "name") == 0) {
+       } else if (strcmp(update, "name") == 0) {
                /* name is stored in virtual_entry->name */
 //             memset(ve->name, ' ', 16);
 //             strncpy(ve->name, info->name, 16);
                rv = -1;
-       } if (strcmp(update, "_reshape_progress") == 0) {
+       } else if (strcmp(update, "_reshape_progress") == 0) {
                /* We don't support reshape yet */
+       } else if (strcmp(update, "assemble") == 0 ) {
+               /* Do nothing, just succeed */
+               rv = 0;
        } else
                rv = -1;
 
@@ -1959,6 +1955,19 @@ static int init_super_ddf_bvd(struct supertype *st,
                return 0;
        }
 
+       if (name)
+               for (venum = 0; venum < __be16_to_cpu(ddf->virt->max_vdes); venum++)
+                       if (!all_ff(ddf->virt->entries[venum].guid)) {
+                               char *n = ddf->virt->entries[venum].name;
+
+                               if (strncmp(name, n, 16) == 0) {
+                                       fprintf(stderr, Name ": This ddf already"
+                                               " has an array called %s\n",
+                                               name);
+                                       return 0;
+                               }
+                       }
+
        for (venum = 0; venum < __be16_to_cpu(ddf->virt->max_vdes); venum++)
                if (all_ff(ddf->virt->entries[venum].guid))
                        break;
@@ -2263,7 +2272,7 @@ static int add_to_super_ddf(struct supertype *st,
 
 static unsigned char null_conf[4096+512];
 
-static int __write_init_super_ddf(struct supertype *st, int do_close)
+static int __write_init_super_ddf(struct supertype *st)
 {
 
        struct ddf_super *ddf = st->sb;
@@ -2370,12 +2379,6 @@ static int __write_init_super_ddf(struct supertype *st, int do_close)
                successes++;
        }
 
-       if (do_close)
-               for (d = ddf->dlist; d; d=d->next) {
-                       close(d->fd);
-                       d->fd = -1;
-               }
-
        return attempts != successes;
 }
 
@@ -2428,7 +2431,7 @@ static int write_init_super_ddf(struct supertype *st)
                struct dl *d;
                for (d = ddf->dlist; d; d=d->next)
                        while (Kill(d->devname, NULL, 0, 1, 1) == 0);
-               return __write_init_super_ddf(st, 1);
+               return __write_init_super_ddf(st);
        }
 }
 
@@ -2877,7 +2880,6 @@ static int load_super_ddf_all(struct supertype *st, int fd,
                st->max_devs = 512;
        }
        st->container_dev = fd2devnum(fd);
-       st->loaded_container = 1;
        return 0;
 }
 
@@ -3231,7 +3233,7 @@ static void ddf_sync_metadata(struct supertype *st)
        if (!ddf->updates_pending)
                return;
        ddf->updates_pending = 0;
-       __write_init_super_ddf(st, 0);
+       __write_init_super_ddf(st);
        dprintf("ddf: sync_metadata\n");
 }
 
@@ -3645,6 +3647,15 @@ static int ddf_level_to_layout(int level)
        }
 }
 
+static void default_geometry_ddf(struct supertype *st, int *level, int *layout, int *chunk)
+{
+       if (level && *level == UnSet)
+               *level = LEVEL_CONTAINER;
+
+       if (level && layout && *layout == UnSet)
+               *layout = ddf_level_to_layout(*level);
+}
+
 struct superswitch super_ddf = {
 #ifndef        MDASSEMBLE
        .examine_super  = examine_super_ddf,
@@ -3673,7 +3684,7 @@ struct superswitch super_ddf = {
        .free_super     = free_super_ddf,
        .match_metadata_desc = match_metadata_desc_ddf,
        .container_content = container_content_ddf,
-       .default_layout = ddf_level_to_layout,
+       .default_geometry = default_geometry_ddf,
 
        .external       = 1,