btrfs-progs: util: Fix a wrong unit of pretty_size

If parameter for pretty_size is smaller than default base(1024),
pretty_size() will output wrong unit.
For example, pretty_size(1008) will output '0.98B' not '1008B' or
'0.98KiB'.

The cause is, for default base and auto-detect unit, base will be 1024
but num_divs is still 0, last result will still be divided by base,
causing the bug.

Fix it by checking num_divs in default case, and if num_divs is 0,
change base to 1.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Qu Wenruo 2016-03-09 10:10:55 +08:00 committed by David Sterba
parent 9f76654de8
commit af83da99d6
1 changed files with 7 additions and 0 deletions

View File

@ -1672,6 +1672,13 @@ int pretty_size_snprintf(u64 size, char *str, size_t str_size, unsigned unit_mod
size /= mult;
num_divs++;
}
/*
* If the value is smaller than base, we didn't do any
* division, in that case, base should be 1, not original
* base, or the unit will be wrong
*/
if (num_divs == 0)
base = 1;
}
if (num_divs >= ARRAY_SIZE(unit_suffix_binary)) {