]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Create: cleanup/unify default geometry handling
authorDan Williams <dan.j.williams@intel.com>
Thu, 18 Nov 2010 09:22:33 +0000 (10:22 +0100)
committerNeilBrown <neilb@suse.de>
Tue, 23 Nov 2010 04:20:50 +0000 (15:20 +1100)
Support metadata specific level, layout and chunksize defaults.  Kill an
uneeded superswitch methods ahead of adding more for the reshape case.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Create.c
mdadm.h
super-ddf.c
super-intel.c

index 9a0ac426d14edf4cf79f008f87966df2b6cb0c58..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) {
@@ -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");
@@ -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);
                }
diff --git a/mdadm.h b/mdadm.h
index 8e220de939cc69693d36a6cd327dba63993e0de2..81f7238f21a344e05916103deb8e3f2c01ac4210 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -626,7 +626,7 @@ extern struct superswitch {
         * added to validate changing size and new devices.  If there are
         * inter-device dependencies, it should record sufficient details
         * so these can be validated.
-        * Both 'size' and '*freesize' are in sectors.  chunk is bytes.
+        * Both 'size' and '*freesize' are in sectors.  chunk is KiB.
         */
        int (*validate_geometry)(struct supertype *st, int level, int layout,
                                 int raiddisks,
@@ -635,10 +635,8 @@ extern struct superswitch {
                                 int verbose);
 
        struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
-       /* Allow a metadata handler to override mdadm's default layouts */
-       int (*default_layout)(int level); /* optional */
-       /* query the supertype for default chunk size */
-       int (*default_chunk)(struct supertype *st); /* optional */
+       /* query the supertype for default geometry */
+       void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */
        /* Permit subarray's to be deleted from inactive containers */
        int (*kill_subarray)(struct supertype *st); /* optional */
        /* Permit subarray's to be modified */
index 98c9d58b4b486c17a1ac15406768357d28c08cba..8ef766b7b0b17079f87735173c95a467007bf3cb 100644 (file)
@@ -3643,6 +3643,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,
@@ -3671,7 +3680,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,
 
index 7087af23af41e5aab5e7f1f61f71ccd9158487bd..9b4ad19a6adce9b9bd011dc61c5e219236e9d54e 100644 (file)
@@ -4180,14 +4180,18 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
        return 0;
 }
 
-static int default_chunk_imsm(struct supertype *st)
+static void default_geometry_imsm(struct supertype *st, int *level, int *layout, int *chunk)
 {
        struct intel_super *super = st->sb;
 
-       if (!super->orom)
-               return 0;
+       if (level && *level == UnSet)
+               *level = LEVEL_CONTAINER;
+
+       if (level && layout && *layout == UnSet)
+               *layout = imsm_level_to_layout(*level);
 
-       return imsm_orom_default_chunk(super->orom);
+       if (chunk && (*chunk == UnSet || *chunk == 0) && super->orom)
+               *chunk = imsm_orom_default_chunk(super->orom);
 }
 
 static void handle_missing(struct intel_super *super, struct imsm_dev *dev);
@@ -5680,7 +5684,6 @@ struct superswitch super_imsm = {
        .brief_detail_super = brief_detail_super_imsm,
        .write_init_super = write_init_super_imsm,
        .validate_geometry = validate_geometry_imsm,
-       .default_chunk  = default_chunk_imsm,
        .add_to_super   = add_to_super_imsm,
        .detail_platform = detail_platform_imsm,
        .kill_subarray = kill_subarray_imsm,
@@ -5704,7 +5707,7 @@ struct superswitch super_imsm = {
        .free_super     = free_super_imsm,
        .match_metadata_desc = match_metadata_desc_imsm,
        .container_content = container_content_imsm,
-       .default_layout = imsm_level_to_layout,
+       .default_geometry = default_geometry_imsm,
        .get_disk_controller_domain = imsm_get_disk_controller_domain,
 
        .external       = 1,