Create: allow per-metadata default layouts
Let handlers specifiy their own defaults, specifically needed for the imsm-raid5 case where mdadm defaults to 'ls' and imsm to 'la'. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
5746141e3f
commit
a18a888ea7
73
Create.c
73
Create.c
|
@ -32,6 +32,44 @@
|
||||||
#include "md_p.h"
|
#include "md_p.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
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 (layout == UnSet)
|
||||||
|
switch(level) {
|
||||||
|
default: /* no layout */
|
||||||
|
layout = 0;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
layout = 0x102; /* near=2, far=1 */
|
||||||
|
if (verbose > 0)
|
||||||
|
fprintf(stderr,
|
||||||
|
Name ": layout defaults to n1\n");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
layout = map_name(r5layout, "default");
|
||||||
|
if (verbose > 0)
|
||||||
|
fprintf(stderr,
|
||||||
|
Name ": layout defaults to %s\n", map_num(r5layout, layout));
|
||||||
|
break;
|
||||||
|
case LEVEL_FAULTY:
|
||||||
|
layout = map_name(faultylayout, "default");
|
||||||
|
|
||||||
|
if (verbose > 0)
|
||||||
|
fprintf(stderr,
|
||||||
|
Name ": layout defaults to %s\n", map_num(faultylayout, layout));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Create(struct supertype *st, char *mddev,
|
int Create(struct supertype *st, char *mddev,
|
||||||
int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
|
int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
|
||||||
char *name, char *homehost, int *uuid,
|
char *name, char *homehost, int *uuid,
|
||||||
|
@ -78,6 +116,7 @@ int Create(struct supertype *st, char *mddev,
|
||||||
unsigned long long bitmapsize;
|
unsigned long long bitmapsize;
|
||||||
struct mdinfo info, *infos;
|
struct mdinfo info, *infos;
|
||||||
int did_default = 0;
|
int did_default = 0;
|
||||||
|
int do_default_layout = 0;
|
||||||
unsigned long safe_mode_delay = 0;
|
unsigned long safe_mode_delay = 0;
|
||||||
char chosen_name[1024];
|
char chosen_name[1024];
|
||||||
struct map_ent *map = NULL;
|
struct map_ent *map = NULL;
|
||||||
|
@ -175,32 +214,12 @@ int Create(struct supertype *st, char *mddev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now set some defaults */
|
/* now set some defaults */
|
||||||
if (layout == UnSet)
|
|
||||||
switch(level) {
|
|
||||||
default: /* no layout */
|
|
||||||
layout = 0;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
layout = 0x102; /* near=2, far=1 */
|
|
||||||
if (verbose > 0)
|
|
||||||
fprintf(stderr,
|
|
||||||
Name ": layout defaults to n1\n");
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
layout = map_name(r5layout, "default");
|
|
||||||
if (verbose > 0)
|
|
||||||
fprintf(stderr,
|
|
||||||
Name ": layout defaults to %s\n", map_num(r5layout, layout));
|
|
||||||
break;
|
|
||||||
case LEVEL_FAULTY:
|
|
||||||
layout = map_name(faultylayout, "default");
|
|
||||||
|
|
||||||
if (verbose > 0)
|
|
||||||
fprintf(stderr,
|
if (layout == UnSet) {
|
||||||
Name ": layout defaults to %s\n", map_num(faultylayout, layout));
|
do_default_layout = 1;
|
||||||
break;
|
layout = default_layout(st, level, verbose);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level == 10)
|
if (level == 10)
|
||||||
/* check layout fits in array*/
|
/* check layout fits in array*/
|
||||||
|
@ -280,6 +299,8 @@ int Create(struct supertype *st, char *mddev,
|
||||||
char *name = "default";
|
char *name = "default";
|
||||||
for(i=0; !st && superlist[i]; i++) {
|
for(i=0; !st && superlist[i]; i++) {
|
||||||
st = superlist[i]->match_metadata_desc(name);
|
st = superlist[i]->match_metadata_desc(name);
|
||||||
|
if (do_default_layout)
|
||||||
|
layout = default_layout(st, level, verbose);
|
||||||
if (st && !st->ss->validate_geometry
|
if (st && !st->ss->validate_geometry
|
||||||
(st, level, layout, raiddisks,
|
(st, level, layout, raiddisks,
|
||||||
chunk, size*2, dname, &freesize,
|
chunk, size*2, dname, &freesize,
|
||||||
|
@ -297,6 +318,8 @@ int Create(struct supertype *st, char *mddev,
|
||||||
st->minor_version != 90)
|
st->minor_version != 90)
|
||||||
did_default = 1;
|
did_default = 1;
|
||||||
} else {
|
} else {
|
||||||
|
if (do_default_layout)
|
||||||
|
layout = default_layout(st, level, verbose);
|
||||||
if (!st->ss->validate_geometry(st, level, layout,
|
if (!st->ss->validate_geometry(st, level, layout,
|
||||||
raiddisks,
|
raiddisks,
|
||||||
chunk, size*2, dname,
|
chunk, size*2, dname,
|
||||||
|
|
2
mdadm.h
2
mdadm.h
|
@ -545,6 +545,8 @@ extern struct superswitch {
|
||||||
int verbose);
|
int verbose);
|
||||||
|
|
||||||
struct mdinfo *(*container_content)(struct supertype *st);
|
struct mdinfo *(*container_content)(struct supertype *st);
|
||||||
|
/* Allow a metadata handler to override mdadm's default layouts */
|
||||||
|
int (*default_layout)(int level); /* optional */
|
||||||
|
|
||||||
/* for mdmon */
|
/* for mdmon */
|
||||||
int (*open_new)(struct supertype *c, struct active_array *a,
|
int (*open_new)(struct supertype *c, struct active_array *a,
|
||||||
|
|
|
@ -1101,7 +1101,7 @@ static int imsm_level_to_layout(int level)
|
||||||
case 10:
|
case 10:
|
||||||
return 0x102;
|
return 0x102;
|
||||||
}
|
}
|
||||||
return -1;
|
return UnSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info)
|
static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info)
|
||||||
|
@ -4143,6 +4143,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,
|
||||||
|
|
||||||
.external = 1,
|
.external = 1,
|
||||||
.name = "imsm",
|
.name = "imsm",
|
||||||
|
|
Loading…
Reference in New Issue