From 913f07d1db4a0078acc26d6ccabe1c315cf9273c Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Thu, 20 Jan 2022 13:18:32 +0100 Subject: [PATCH 10/83] 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 Signed-off-by: Jes Sorensen --- Build.c | 23 +------------------ Create.c | 67 ++++++++++++++++++++++++++++++++++---------------------- mdadm.h | 1 + 3 files changed, 43 insertions(+), 48 deletions(-) diff --git a/Build.c b/Build.c index 962c2e37..8d6f6f58 100644 --- a/Build.c +++ b/Build.c @@ -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); diff --git a/Create.c b/Create.c index 0ff1922d..9ea19de0 100644 --- a/Create.c +++ b/Create.c @@ -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; } diff --git a/mdadm.h b/mdadm.h index 26e7e5cd..cd72e711 100644 --- a/mdadm.h +++ b/mdadm.h @@ -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); -- 2.38.1