From 30f58b2208778245963ee5562f4b2efbde3188cf Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 18 Nov 2010 10:22:33 +0100 Subject: [PATCH] Create: cleanup/unify default geometry handling 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 Signed-off-by: NeilBrown --- Create.c | 21 ++++++--------------- mdadm.h | 8 +++----- super-ddf.c | 11 ++++++++++- super-intel.c | 15 +++++++++------ 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/Create.c b/Create.c index 9a0ac42..4a79fb0 100644 --- 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 8e220de..81f7238 100644 --- 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 */ diff --git a/super-ddf.c b/super-ddf.c index 98c9d58..8ef766b 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -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, diff --git a/super-intel.c b/super-intel.c index 7087af2..9b4ad19 100644 --- a/super-intel.c +++ b/super-intel.c @@ -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; - return imsm_orom_default_chunk(super->orom); + if (level && layout && *layout == UnSet) + *layout = imsm_level_to_layout(*level); + + 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,