Make parse_profile a shared function so it can be used across the code-base.
Signed-off-by: Hugo Mills <h...@carfax.org.uk> Conflicts: mkfs.c --- mkfs.c | 94 --------------------------------------------------------------- utils.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 1 + 3 files changed, 95 insertions(+), 94 deletions(-) diff --git a/mkfs.c b/mkfs.c index 02a7086..51e545f 100644 --- a/mkfs.c +++ b/mkfs.c @@ -348,100 +348,6 @@ static void print_version(void) exit(0); } -static u64 make_profile(int copies, int dup, int stripes, int parity) -{ - if(copies == 1 && !dup && stripes == 0 && parity == 0) - return 0; - else if(copies == 2 && dup && stripes == 0 && parity == 0) - return BTRFS_BLOCK_GROUP_DUP; - else if(copies == 2 && !dup && stripes == 0 && parity == 0) - return BTRFS_BLOCK_GROUP_RAID1; - else if(copies == 2 && !dup && stripes == -1 && parity == 0) - return BTRFS_BLOCK_GROUP_RAID10; - else if(copies == 1 && !dup && stripes == -1 && parity == 0) - return BTRFS_BLOCK_GROUP_RAID0; - else if(copies == 1 && !dup && stripes == -1 && parity == 1) - return BTRFS_BLOCK_GROUP_RAID5; - else if(copies == 1 && !dup && stripes == -1 && parity == 2) - return BTRFS_BLOCK_GROUP_RAID6; - - return (u64)-1; -} - -static u64 parse_profile(const char *s) -{ - char *pos, *parse_end; - int copies = 1; - int stripes = 0; - int parity = 0; - int dup = 0; - u64 profile = (u64)-1; - - /* Look for exact match with historical forms first */ - if (strcmp(s, "raid0") == 0) { - return BTRFS_BLOCK_GROUP_RAID0; - } else if (strcmp(s, "raid1") == 0) { - return BTRFS_BLOCK_GROUP_RAID1; - } else if (strcmp(s, "raid5") == 0) { - return BTRFS_BLOCK_GROUP_RAID5; - } else if (strcmp(s, "raid6") == 0) { - return BTRFS_BLOCK_GROUP_RAID6; - } else if (strcmp(s, "raid10") == 0) { - return BTRFS_BLOCK_GROUP_RAID10; - } else if (strcmp(s, "dup") == 0) { - return BTRFS_BLOCK_GROUP_DUP; - } else if (strcmp(s, "single") == 0) { - return 0; - } - - /* Attempt to parse new nCmSpP form */ - /* nC is required and n must be an unsigned decimal number */ - copies = strtoul(s, &parse_end, 10); - if(parse_end == s || (*parse_end != 'c' && *parse_end != 'C')) - goto unknown; - - /* C may be followed by D to indicate non-redundant/DUP */ - pos = parse_end + 1; - if(*pos == 'D' || *pos == 'd') { - dup = 1; - pos++; - } - if(*pos == 0) - goto done; - - /* mS is optional, and m may be an integer, or a literal "m" */ - if(*pos == 'm') { - stripes = -1; - parse_end = pos+1; - } else { - stripes = strtoul(pos, &parse_end, 10); - } - if(parse_end == pos || (*parse_end != 's' && *parse_end != 'S')) - goto unknown; - - pos = parse_end + 1; - if(*pos == 0) - goto done; - - /* pP is optional, and p must be an integer */ - parity = strtoul(pos, &parse_end, 10); - if(parse_end == pos || (*parse_end != 'p' && *parse_end != 'P')) - goto unknown; - pos = parse_end + 1; - if(*pos != 0) - goto unknown; - -done: - profile = make_profile(copies, dup, stripes, parity); - if(profile == (u64)-1) - fprintf(stderr, "Unknown or unavailable profile '%s'\n", s); - return profile; - -unknown: - fprintf(stderr, "Unparseable profile '%s'\n", s); - return (u64)-1; -} - static char *parse_label(char *input) { int len = strlen(input); diff --git a/utils.c b/utils.c index 1813dda..a6fb246 100644 --- a/utils.c +++ b/utils.c @@ -1420,6 +1420,100 @@ u64 parse_size(char *s) return strtoull(s, NULL, 10) * mult; } +static u64 make_profile(int copies, int dup, int stripes, int parity) +{ + if(copies == 1 && !dup && stripes == 0 && parity == 0) + return 0; + else if(copies == 2 && dup && stripes == 0 && parity == 0) + return BTRFS_BLOCK_GROUP_DUP; + else if(copies == 2 && !dup && stripes == 0 && parity == 0) + return BTRFS_BLOCK_GROUP_RAID1; + else if(copies == 2 && !dup && stripes == -1 && parity == 0) + return BTRFS_BLOCK_GROUP_RAID10; + else if(copies == 1 && !dup && stripes == -1 && parity == 0) + return BTRFS_BLOCK_GROUP_RAID0; + else if(copies == 1 && !dup && stripes == -1 && parity == 1) + return BTRFS_BLOCK_GROUP_RAID5; + else if(copies == 1 && !dup && stripes == -1 && parity == 2) + return BTRFS_BLOCK_GROUP_RAID6; + + return (u64)-1; +} + +u64 parse_profile(const char *s) +{ + char *pos, *parse_end; + int copies = 1; + int stripes = 0; + int parity = 0; + int dup = 0; + u64 profile = (u64)-1; + + /* Look for exact match with historical forms first */ + if (strcmp(s, "raid0") == 0) { + return BTRFS_BLOCK_GROUP_RAID0; + } else if (strcmp(s, "raid1") == 0) { + return BTRFS_BLOCK_GROUP_RAID1; + } else if (strcmp(s, "raid5") == 0) { + return BTRFS_BLOCK_GROUP_RAID5; + } else if (strcmp(s, "raid6") == 0) { + return BTRFS_BLOCK_GROUP_RAID6; + } else if (strcmp(s, "raid10") == 0) { + return BTRFS_BLOCK_GROUP_RAID10; + } else if (strcmp(s, "dup") == 0) { + return BTRFS_BLOCK_GROUP_DUP; + } else if (strcmp(s, "single") == 0) { + return 0; + } + + /* Attempt to parse new nCmSpP form */ + /* nC is required and n must be an unsigned decimal number */ + copies = strtoul(s, &parse_end, 10); + if(parse_end == s || (*parse_end != 'c' && *parse_end != 'C')) + goto unknown; + + /* C may be followed by D to indicate non-redundant/DUP */ + pos = parse_end + 1; + if(*pos == 'D' || *pos == 'd') { + dup = 1; + pos++; + } + if(*pos == 0) + goto done; + + /* mS is optional, and m may be an integer, or a literal "m" */ + if(*pos == 'm') { + stripes = -1; + parse_end = pos+1; + } else { + stripes = strtoul(pos, &parse_end, 10); + } + if(parse_end == pos || (*parse_end != 's' && *parse_end != 'S')) + goto unknown; + + pos = parse_end + 1; + if(*pos == 0) + goto done; + + /* pP is optional, and p must be an integer */ + parity = strtoul(pos, &parse_end, 10); + if(parse_end == pos || (*parse_end != 'p' && *parse_end != 'P')) + goto unknown; + pos = parse_end + 1; + if(*pos != 0) + goto unknown; + +done: + profile = make_profile(copies, dup, stripes, parity); + if(profile == (u64)-1) + fprintf(stderr, "Unknown or unavailable profile '%s'\n", s); + return profile; + +unknown: + fprintf(stderr, "Unparseable profile '%s'\n", s); + return (u64)-1; +} + int open_file_or_dir(const char *fname) { int ret; diff --git a/utils.h b/utils.h index 0b681ed..dcaaa7f 100644 --- a/utils.h +++ b/utils.h @@ -47,6 +47,7 @@ char *pretty_sizes(u64 size); int get_mountpt(char *dev, char *mntpt, size_t size); int btrfs_scan_block_devices(int run_ioctl); u64 parse_size(char *s); +u64 parse_profile(const char* s); int open_file_or_dir(const char *fname); int get_device_info(int fd, u64 devid, struct btrfs_ioctl_dev_info_args *di_args); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html