Create, Build: use default_layout()

This code is duplicated for Build mode so make default_layout() extern
and use it. Simplify the function structure.

It introduced change for Build mode, now for raid0 RAID0_ORIG_LAYOUT
will be returned same as for Create.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
Mariusz Tkaczyk 2022-01-20 13:18:32 +01:00 committed by Jes Sorensen
parent c33bbda5b0
commit 913f07d1db
3 changed files with 43 additions and 48 deletions

23
Build.c
View File

@ -71,28 +71,7 @@ int Build(char *mddev, struct mddev_dev *devlist,
}
if (s->layout == UnSet)
switch(s->level) {
default: /* no layout */
s->layout = 0;
break;
case 10:
s->layout = 0x102; /* near=2, far=1 */
if (c->verbose > 0)
pr_err("layout defaults to n1\n");
break;
case 5:
case 6:
s->layout = map_name(r5layout, "default");
if (c->verbose > 0)
pr_err("layout defaults to %s\n", map_num(r5layout, s->layout));
break;
case LEVEL_FAULTY:
s->layout = map_name(faultylayout, "default");
if (c->verbose > 0)
pr_err("layout defaults to %s\n", map_num(faultylayout, s->layout));
break;
}
s->layout = default_layout(NULL, s->level, c->verbose);
/* We need to create the device. It can have no name. */
map_lock(&map);

View File

@ -39,39 +39,54 @@ static int round_size_and_verify(unsigned long long *size, int chunk)
return 0;
}
static int default_layout(struct supertype *st, int level, int verbose)
/**
* default_layout() - Get default layout for level.
* @st: metadata requested, could be NULL.
* @level: raid level requested.
* @verbose: verbose level.
*
* Try to ask metadata handler first, otherwise use global defaults.
*
* Return: Layout or &UnSet, return value meaning depends of level used.
*/
int default_layout(struct supertype *st, int level, int verbose)
{
int layout = UnSet;
mapping_t *layout_map = NULL;
char *layout_name = NULL;
if (st && st->ss->default_geometry)
st->ss->default_geometry(st, &level, &layout, NULL);
if (layout == UnSet)
switch(level) {
default: /* no layout */
layout = 0;
break;
case 0:
layout = RAID0_ORIG_LAYOUT;
break;
case 10:
layout = 0x102; /* near=2, far=1 */
if (verbose > 0)
pr_err("layout defaults to n2\n");
break;
case 5:
case 6:
layout = map_name(r5layout, "default");
if (verbose > 0)
pr_err("layout defaults to %s\n", map_num(r5layout, layout));
break;
case LEVEL_FAULTY:
layout = map_name(faultylayout, "default");
if (layout != UnSet)
return layout;
if (verbose > 0)
pr_err("layout defaults to %s\n", map_num(faultylayout, layout));
break;
}
switch (level) {
default: /* no layout */
layout = 0;
break;
case 0:
layout = RAID0_ORIG_LAYOUT;
break;
case 10:
layout = 0x102; /* near=2, far=1 */
layout_name = "n2";
break;
case 5:
case 6:
layout_map = r5layout;
break;
case LEVEL_FAULTY:
layout_map = faultylayout;
break;
}
if (layout_map) {
layout = map_name(layout_map, "default");
layout_name = map_num(layout_map, layout);
}
if (layout_name && verbose > 0)
pr_err("layout defaults to %s\n", layout_name);
return layout;
}

View File

@ -1512,6 +1512,7 @@ extern int get_linux_version(void);
extern int mdadm_version(char *version);
extern unsigned long long parse_size(char *size);
extern int parse_uuid(char *str, int uuid[4]);
int default_layout(struct supertype *st, int level, int verbose);
extern int is_near_layout_10(int layout);
extern int parse_layout_10(char *layout);
extern int parse_layout_faulty(char *layout);