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 <dan.j.williams@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
3e82d76d2e
commit
30f58b2208
21
Create.c
21
Create.c
|
@ -31,8 +31,8 @@ static int default_layout(struct supertype *st, int level, int verbose)
|
||||||
{
|
{
|
||||||
int layout = UnSet;
|
int layout = UnSet;
|
||||||
|
|
||||||
if (st && st->ss->default_layout)
|
if (st && st->ss->default_geometry)
|
||||||
layout = st->ss->default_layout(level);
|
st->ss->default_geometry(st, &level, &layout, NULL);
|
||||||
|
|
||||||
if (layout == UnSet)
|
if (layout == UnSet)
|
||||||
switch(level) {
|
switch(level) {
|
||||||
|
@ -120,15 +120,8 @@ int Create(struct supertype *st, char *mddev,
|
||||||
int major_num = BITMAP_MAJOR_HI;
|
int major_num = BITMAP_MAJOR_HI;
|
||||||
|
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
|
if (level == UnSet && st && st->ss->default_geometry)
|
||||||
if (level == UnSet) {
|
st->ss->default_geometry(st, &level, NULL, NULL);
|
||||||
/* "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) {
|
if (level == UnSet) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": a RAID level is needed to create an array.\n");
|
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 6:
|
||||||
case 0:
|
case 0:
|
||||||
if (chunk == 0) {
|
if (chunk == 0) {
|
||||||
if (st && st->ss->default_chunk)
|
if (st && st->ss->default_geometry)
|
||||||
chunk = st->ss->default_chunk(st);
|
st->ss->default_geometry(st, NULL, NULL, &chunk);
|
||||||
|
|
||||||
chunk = chunk ? : 512;
|
chunk = chunk ? : 512;
|
||||||
|
|
||||||
if (verbose > 0)
|
if (verbose > 0)
|
||||||
fprintf(stderr, Name ": chunk size defaults to %dK\n", chunk);
|
fprintf(stderr, Name ": chunk size defaults to %dK\n", chunk);
|
||||||
}
|
}
|
||||||
|
|
8
mdadm.h
8
mdadm.h
|
@ -626,7 +626,7 @@ extern struct superswitch {
|
||||||
* added to validate changing size and new devices. If there are
|
* added to validate changing size and new devices. If there are
|
||||||
* inter-device dependencies, it should record sufficient details
|
* inter-device dependencies, it should record sufficient details
|
||||||
* so these can be validated.
|
* 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 (*validate_geometry)(struct supertype *st, int level, int layout,
|
||||||
int raiddisks,
|
int raiddisks,
|
||||||
|
@ -635,10 +635,8 @@ extern struct superswitch {
|
||||||
int verbose);
|
int verbose);
|
||||||
|
|
||||||
struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
|
struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
|
||||||
/* Allow a metadata handler to override mdadm's default layouts */
|
/* query the supertype for default geometry */
|
||||||
int (*default_layout)(int level); /* optional */
|
void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */
|
||||||
/* query the supertype for default chunk size */
|
|
||||||
int (*default_chunk)(struct supertype *st); /* optional */
|
|
||||||
/* Permit subarray's to be deleted from inactive containers */
|
/* Permit subarray's to be deleted from inactive containers */
|
||||||
int (*kill_subarray)(struct supertype *st); /* optional */
|
int (*kill_subarray)(struct supertype *st); /* optional */
|
||||||
/* Permit subarray's to be modified */
|
/* Permit subarray's to be modified */
|
||||||
|
|
11
super-ddf.c
11
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 = {
|
struct superswitch super_ddf = {
|
||||||
#ifndef MDASSEMBLE
|
#ifndef MDASSEMBLE
|
||||||
.examine_super = examine_super_ddf,
|
.examine_super = examine_super_ddf,
|
||||||
|
@ -3671,7 +3680,7 @@ struct superswitch super_ddf = {
|
||||||
.free_super = free_super_ddf,
|
.free_super = free_super_ddf,
|
||||||
.match_metadata_desc = match_metadata_desc_ddf,
|
.match_metadata_desc = match_metadata_desc_ddf,
|
||||||
.container_content = container_content_ddf,
|
.container_content = container_content_ddf,
|
||||||
.default_layout = ddf_level_to_layout,
|
.default_geometry = default_geometry_ddf,
|
||||||
|
|
||||||
.external = 1,
|
.external = 1,
|
||||||
|
|
||||||
|
|
|
@ -4180,14 +4180,18 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
return 0;
|
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;
|
struct intel_super *super = st->sb;
|
||||||
|
|
||||||
if (!super->orom)
|
if (level && *level == UnSet)
|
||||||
return 0;
|
*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);
|
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,
|
.brief_detail_super = brief_detail_super_imsm,
|
||||||
.write_init_super = write_init_super_imsm,
|
.write_init_super = write_init_super_imsm,
|
||||||
.validate_geometry = validate_geometry_imsm,
|
.validate_geometry = validate_geometry_imsm,
|
||||||
.default_chunk = default_chunk_imsm,
|
|
||||||
.add_to_super = add_to_super_imsm,
|
.add_to_super = add_to_super_imsm,
|
||||||
.detail_platform = detail_platform_imsm,
|
.detail_platform = detail_platform_imsm,
|
||||||
.kill_subarray = kill_subarray_imsm,
|
.kill_subarray = kill_subarray_imsm,
|
||||||
|
@ -5704,7 +5707,7 @@ struct superswitch super_imsm = {
|
||||||
.free_super = free_super_imsm,
|
.free_super = free_super_imsm,
|
||||||
.match_metadata_desc = match_metadata_desc_imsm,
|
.match_metadata_desc = match_metadata_desc_imsm,
|
||||||
.container_content = container_content_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,
|
.get_disk_controller_domain = imsm_get_disk_controller_domain,
|
||||||
|
|
||||||
.external = 1,
|
.external = 1,
|
||||||
|
|
Loading…
Reference in New Issue