diff --git a/common/parse-utils.c b/common/parse-utils.c index b6664fd4..ad57b74a 100644 --- a/common/parse-utils.c +++ b/common/parse-utils.c @@ -276,3 +276,34 @@ int parse_bg_profile(const char *profile, u64 *flags) } return 1; } + +/* + * Parse qgroupid of format LEVEL/ID, level and id are numerical, nothing must + * follow after the last character of ID. + */ +int parse_qgroupid(const char *str, u64 *qgroupid) +{ + char *end = NULL; + u64 level; + u64 id; + + level = strtoull(str, &end, 10); + if (str == end) + return -EINVAL; + if (end[0] != '/') + return -EINVAL; + str = end + 1; + end = NULL; + id = strtoull(str, &end, 10); + if (str == end) + return -EINVAL; + if (end[0]) + return -EINVAL; + if (id >= (1ULL << BTRFS_QGROUP_LEVEL_SHIFT)) + return -ERANGE; + if (level >= (1ULL << (64 - BTRFS_QGROUP_LEVEL_SHIFT))) + return -ERANGE; + + *qgroupid = (level << BTRFS_QGROUP_LEVEL_SHIFT) | id; + return 0; +} diff --git a/common/parse-utils.h b/common/parse-utils.h index 68210a7a..97826577 100644 --- a/common/parse-utils.h +++ b/common/parse-utils.h @@ -29,6 +29,7 @@ int parse_range(const char *range, u64 *start, u64 *end); int parse_range_strict(const char *range, u64 *start, u64 *end); int parse_bg_profile(const char *profile, u64 *flags); int parse_compress_type(const char *type); +int parse_qgroupid(const char *str, u64 *qgroupid); int fls64(u64 x); #endif diff --git a/common/utils.c b/common/utils.c index ba592022..f7f9eb4e 100644 --- a/common/utils.c +++ b/common/utils.c @@ -48,6 +48,7 @@ #include "common/utils.h" #include "common/path-utils.h" #include "common/device-scan.h" +#include "common/parse-utils.h" #include "kernel-shared/volumes.h" #include "ioctl.h" #include "cmds/commands.h" @@ -227,37 +228,6 @@ int set_label(const char *btrfs_dev, const char *label) return ret; } -/* - * Parse qgroupid of format LEVEL/ID, level and id are numerical, nothing must - * follow after the last character of ID. - */ -int parse_qgroupid(const char *str, u64 *qgroupid) -{ - char *end = NULL; - u64 level; - u64 id; - - level = strtoull(str, &end, 10); - if (str == end) - return -EINVAL; - if (end[0] != '/') - return -EINVAL; - str = end + 1; - end = NULL; - id = strtoull(str, &end, 10); - if (str == end) - return -EINVAL; - if (end[0]) - return -EINVAL; - if (id >= (1ULL << BTRFS_QGROUP_LEVEL_SHIFT)) - return -ERANGE; - if (level >= (1ULL << (64 - BTRFS_QGROUP_LEVEL_SHIFT))) - return -ERANGE; - - *qgroupid = (level << BTRFS_QGROUP_LEVEL_SHIFT) | id; - return 0; -} - u64 parse_qgroupid_or_path(const char *p) { enum btrfs_util_error err;