157 lines
4.2 KiB
Diff
157 lines
4.2 KiB
Diff
|
From 913f07d1db4a0078acc26d6ccabe1c315cf9273c Mon Sep 17 00:00:00 2001
|
||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||
|
Date: Thu, 20 Jan 2022 13:18:32 +0100
|
||
|
Subject: [PATCH 10/61] Create, Build: use default_layout()
|
||
|
Patch-mainline: mdadm-4.2+
|
||
|
References: jsc#PED-1009
|
||
|
|
||
|
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>
|
||
|
Signed-off-by: Coly Li <colyli@suse.de>
|
||
|
---
|
||
|
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 962c2e3..8d6f6f5 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 0ff1922..9ea19de 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 26e7e5c..cd72e71 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.35.3
|
||
|
|