diff options
author | NeilBrown <neilb@suse.de> | 2009-07-14 11:29:20 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-07-14 11:29:20 +1000 |
commit | 4a06e2c270948bdcfaa447c8a0e80abb0978b5c4 (patch) | |
tree | 51840f16e0bc5a6a9884788e858e87f84df887c3 /util.c | |
parent | 84e11361aa37c92c3c016095e5db7f4fc434ac18 (diff) | |
download | mdadm-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.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -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. |