summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-07-14 11:29:20 +1000
committerNeilBrown <neilb@suse.de>2009-07-14 11:29:20 +1000
commit4a06e2c270948bdcfaa447c8a0e80abb0978b5c4 (patch)
tree51840f16e0bc5a6a9884788e858e87f84df887c3 /util.c
parent84e11361aa37c92c3c016095e5db7f4fc434ac18 (diff)
downloadmdadm-4a06e2c270948bdcfaa447c8a0e80abb0978b5c4.tar.gz
mdadm-4a06e2c270948bdcfaa447c8a0e80abb0978b5c4.tar.xz
mdadm-4a06e2c270948bdcfaa447c8a0e80abb0978b5c4.zip
main: factor out code to parse layout for raid10 and faulty.
This will soon be called from multiple places. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r--util.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/util.c b/util.c
index 080decc..c0c3f0c 100644
--- a/util.c
+++ b/util.c
@@ -185,6 +185,40 @@ long long parse_size(char *size)
return s;
}
+int parse_layout_10(char *layout)
+{
+ int copies, rv;
+ char *cp;
+ /* Parse the layout string for raid10 */
+ /* 'f', 'o' or 'n' followed by a number <= raid_disks */
+ if ((layout[0] != 'n' && layout[0] != 'f' && layout[0] != 'o') ||
+ (copies = strtoul(layout+1, &cp, 10)) < 1 ||
+ copies > 200 ||
+ *cp)
+ return -1;
+ if (layout[0] == 'n')
+ rv = 256 + copies;
+ else if (layout[0] == 'o')
+ rv = 0x10000 + (copies<<8) + 1;
+ else
+ rv = 1 + (copies<<8);
+ return rv;
+}
+
+int parse_layout_faulty(char *layout)
+{
+ /* Parse the layout string for 'faulty' */
+ int ln = strcspn(layout, "0123456789");
+ char *m = strdup(layout);
+ int mode;
+ m[ln] = 0;
+ mode = map_name(faultylayout, m);
+ if (mode == UnSet)
+ return -1;
+
+ return mode | (atoi(layout+ln)<< ModeShift);
+}
+
void remove_partitions(int fd)
{
/* remove partitions from this block devices.