]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Create, Build: use default_layout()
authorMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Thu, 20 Jan 2022 12:18:32 +0000 (13:18 +0100)
committerJes Sorensen <jsorensen@fb.com>
Tue, 5 Apr 2022 01:20:27 +0000 (21:20 -0400)
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>
Build.c
Create.c
mdadm.h

diff --git a/Build.c b/Build.c
index 962c2e3776b91ccb15135b9c0cff91f322a8c9fe..8d6f6f582104f5771788391aeb7c58d51d95e25e 100644 (file)
--- 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);
index 0ff1922ddc6ebdfa602fed274164e8ea9f103922..9ea19de0d7227fc938f8cf90e1ba184706c8873f 100644 (file)
--- 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 26e7e5cd97c6a046e0c1d52a5452c022a54baa46..cd72e7114b9df036929e822358bb10cd7d19dc4f 100644 (file)
--- 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);