From: Tejun Heo tj@kernel.org
mainline inclusion from mainline-5.3-rc1 commit 38cf3a687f5827fcfc81cbc433ef5822693a49c1 category: feature bugzilla: 38688 CVE: NA
---------------------------
a5e112e6424a ("cgroup: add cgroup_parse_float()") accidentally added cgroup_parse_float() inside CONFIG_SYSFS block. Move it outside so that it doesn't cause failures on !CONFIG_SYSFS builds.
Signed-off-by: Tejun Heo tj@kernel.org Fixes: a5e112e6424a ("cgroup: add cgroup_parse_float()") Signed-off-by: Yu Kuai yukuai3@huawei.com Reviewed-by: Hou Tao houtao1@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- kernel/cgroup/cgroup.c | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-)
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index bcdd8030ac742..26df59dd7f60f 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -5899,6 +5899,48 @@ struct cgroup *cgroup_get_from_fd(int fd) } EXPORT_SYMBOL_GPL(cgroup_get_from_fd);
+static u64 power_of_ten(int power) +{ + u64 v = 1; + while (power--) + v *= 10; + return v; +} + +/** + * cgroup_parse_float - parse a floating number + * @input: input string + * @dec_shift: number of decimal digits to shift + * @v: output + * + * Parse a decimal floating point number in @input and store the result in + * @v with decimal point right shifted @dec_shift times. For example, if + * @input is "12.3456" and @dec_shift is 3, *@v will be set to 12345. + * Returns 0 on success, -errno otherwise. + * + * There's nothing cgroup specific about this function except that it's + * currently the only user. + */ +int cgroup_parse_float(const char *input, unsigned dec_shift, s64 *v) +{ + s64 whole, frac = 0; + int fstart = 0, fend = 0, flen; + + if (!sscanf(input, "%lld.%n%lld%n", &whole, &fstart, &frac, &fend)) + return -EINVAL; + if (frac < 0) + return -EINVAL; + + flen = fend > fstart ? fend - fstart : 0; + if (flen < dec_shift) + frac *= power_of_ten(dec_shift - flen); + else + frac = DIV_ROUND_CLOSEST_ULL(frac, power_of_ten(flen - dec_shift)); + + *v = whole * power_of_ten(dec_shift) + frac; + return 0; +} + /* * sock->sk_cgrp_data handling. For more info, see sock_cgroup_data * definition in cgroup-defs.h. @@ -6077,46 +6119,4 @@ static int __init cgroup_sysfs_init(void) } subsys_initcall(cgroup_sysfs_init);
-static u64 power_of_ten(int power) -{ - u64 v = 1; - while (power--) - v *= 10; - return v; -} - -/** - * cgroup_parse_float - parse a floating number - * @input: input string - * @dec_shift: number of decimal digits to shift - * @v: output - * - * Parse a decimal floating point number in @input and store the result in - * @v with decimal point right shifted @dec_shift times. For example, if - * @input is "12.3456" and @dec_shift is 3, *@v will be set to 12345. - * Returns 0 on success, -errno otherwise. - * - * There's nothing cgroup specific about this function except that it's - * currently the only user. - */ -int cgroup_parse_float(const char *input, unsigned dec_shift, s64 *v) -{ - s64 whole, frac = 0; - int fstart = 0, fend = 0, flen; - - if (!sscanf(input, "%lld.%n%lld%n", &whole, &fstart, &frac, &fend)) - return -EINVAL; - if (frac < 0) - return -EINVAL; - - flen = fend > fstart ? fend - fstart : 0; - if (flen < dec_shift) - frac *= power_of_ten(dec_shift - flen); - else - frac = DIV_ROUND_CLOSEST_ULL(frac, power_of_ten(flen - dec_shift)); - - *v = whole * power_of_ten(dec_shift) + frac; - return 0; -} - #endif /* CONFIG_SYSFS */