diff --git a/qa/standalone/mon/test_pool_quota.sh b/qa/standalone/mon/test_pool_quota.sh
index 85941a895f6..22a924477dc 100755
--- a/qa/standalone/mon/test_pool_quota.sh
+++ b/qa/standalone/mon/test_pool_quota.sh
@@ -50,14 +50,14 @@ function TEST_pool_quota() {
objects=`ceph df detail | grep -w $poolname|awk '{print $3}'`
bytes=`ceph df detail | grep -w $poolname|awk '{print $4}'`
+
+ if [ $objects != '1000' ] || [ $bytes != '1K' ] ;
+ then
+ return 1
+ fi
- if [ $objects != '1000' ] || [ $bytes != '1024' ] ;
- then
- return 1
- fi
-
- ceph osd pool delete $poolname $poolname --yes-i-really-really-mean-it
- teardown $dir || return 1
+ ceph osd pool delete $poolname $poolname --yes-i-really-really-mean-it
+ teardown $dir || return 1
}
main testpoolquota
diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh
index 9f735a0171f..584c0677731 100755
--- a/qa/workunits/cephtool/test.sh
+++ b/qa/workunits/cephtool/test.sh
@@ -1744,7 +1744,7 @@ function test_mon_osd_pool_quota()
# get quotas
#
ceph osd pool get-quota tmp-quota-pool | grep 'max bytes.*10B'
- ceph osd pool get-quota tmp-quota-pool | grep 'max objects.*10240k objects'
+ ceph osd pool get-quota tmp-quota-pool | grep 'max objects.*10M objects'
#
# get quotas in json-pretty format
#
diff --git a/qa/workunits/rbd/cli_generic.sh b/qa/workunits/rbd/cli_generic.sh
index f958520842f..c409c8c5c04 100755
--- a/qa/workunits/rbd/cli_generic.sh
+++ b/qa/workunits/rbd/cli_generic.sh
@@ -147,8 +147,8 @@ test_ls() {
rbd ls | grep test2
rbd ls | wc -l | grep 2
# look for fields in output of ls -l without worrying about space
- rbd ls -l | grep 'test1.*1024k.*1'
- rbd ls -l | grep 'test2.*1024k.*1'
+ rbd ls -l | grep 'test1.*1M.*1'
+ rbd ls -l | grep 'test2.*1M.*1'
rbd rm test1
rbd rm test2
@@ -158,8 +158,8 @@ test_ls() {
rbd ls | grep test1
rbd ls | grep test2
rbd ls | wc -l | grep 2
- rbd ls -l | grep 'test1.*1024k.*2'
- rbd ls -l | grep 'test2.*1024k.*2'
+ rbd ls -l | grep 'test1.*1M.*2'
+ rbd ls -l | grep 'test2.*1M.*2'
rbd rm test1
rbd rm test2
@@ -169,8 +169,8 @@ test_ls() {
rbd ls | grep test1
rbd ls | grep test2
rbd ls | wc -l | grep 2
- rbd ls -l | grep 'test1.*1024k.*2'
- rbd ls -l | grep 'test2.*1024k.*1'
+ rbd ls -l | grep 'test1.*1M.*2'
+ rbd ls -l | grep 'test2.*1M.*1'
remove_images
# test that many images can be shown by ls
diff --git a/qa/workunits/rbd/import_export.sh b/qa/workunits/rbd/import_export.sh
index 41585f2843b..639f569d0bb 100755
--- a/qa/workunits/rbd/import_export.sh
+++ b/qa/workunits/rbd/import_export.sh
@@ -158,7 +158,7 @@ dd if=/dev/urandom bs=1M count=1 of=${TMPDIR}/sparse2; truncate ${TMPDIR}/sparse
# 1M sparse, 1M data
rbd rm sparse1 || true
rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse1
-rbd ls -l | grep sparse1 | grep -i '2048k'
+rbd ls -l | grep sparse1 | grep -i '2M'
[ $tiered -eq 1 -o "$(objects sparse1)" = '1' ]
# export, compare contents and on-disk size
@@ -170,7 +170,7 @@ rbd rm sparse1
# 1M data, 1M sparse
rbd rm sparse2 || true
rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse2
-rbd ls -l | grep sparse2 | grep -i '2048k'
+rbd ls -l | grep sparse2 | grep -i '2M'
[ $tiered -eq 1 -o "$(objects sparse2)" = '0' ]
rbd export sparse2 ${TMPDIR}/sparse2.out
compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out
@@ -181,7 +181,7 @@ rbd rm sparse2
truncate ${TMPDIR}/sparse1 -s 10M
# import from stdin just for fun, verify still sparse
rbd import $RBD_CREATE_ARGS --order 20 - sparse1 < ${TMPDIR}/sparse1
-rbd ls -l | grep sparse1 | grep -i '10240k'
+rbd ls -l | grep sparse1 | grep -i '10M'
[ $tiered -eq 1 -o "$(objects sparse1)" = '1' ]
rbd export sparse1 ${TMPDIR}/sparse1.out
compare_files_and_ondisk_sizes ${TMPDIR}/sparse1 ${TMPDIR}/sparse1.out
@@ -192,7 +192,7 @@ rbd rm sparse1
dd if=/dev/urandom bs=2M count=1 of=${TMPDIR}/sparse2 oflag=append conv=notrunc
# again from stding
rbd import $RBD_CREATE_ARGS --order 20 - sparse2 < ${TMPDIR}/sparse2
-rbd ls -l | grep sparse2 | grep -i '4096k'
+rbd ls -l | grep sparse2 | grep -i '4M'
[ $tiered -eq 1 -o "$(objects sparse2)" = '0 2 3' ]
rbd export sparse2 ${TMPDIR}/sparse2.out
compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out
diff --git a/src/include/types.h b/src/include/types.h
index e904a151d75..6c89691af35 100644
--- a/src/include/types.h
+++ b/src/include/types.h
@@ -345,20 +345,40 @@ struct si_t {
inline ostream& operator<<(ostream& out, const si_t& b)
{
- uint64_t bump_after = 100;
- if (b.v > bump_after << 60)
- return out << (b.v >> 60) << "E";
- if (b.v > bump_after << 50)
- return out << (b.v >> 50) << "P";
- if (b.v > bump_after << 40)
- return out << (b.v >> 40) << "T";
- if (b.v > bump_after << 30)
- return out << (b.v >> 30) << "G";
- if (b.v > bump_after << 20)
- return out << (b.v >> 20) << "M";
- if (b.v > bump_after << 10)
- return out << (b.v >> 10) << "k";
- return out << b.v;
+ char buffer[32];
+ uint64_t n = b.v;
+ int index = 0;
+
+ while (n >= 1024 && index < 6) {
+ n /= 1024;
+ index++;
+ }
+
+ char u = " KMGTPE"[index];
+
+ if (index == 0) {
+ (void) snprintf(buffer, sizeof(buffer), "%" PRId64, n);
+ } else if ((b.v & ((1ULL << 10 * index) - 1)) == 0) {
+ // If this is an even multiple of the base, always display
+ // without any decimal fraction.
+ (void) snprintf(buffer, sizeof(buffer), "%" PRId64 "%c", n, u);
+ } else {
+ // We want to choose a precision that reflects the best choice
+ // for fitting in 5 characters. This can get rather tricky when
+ // we have numbers that are very close to an order of magnitude.
+ // For example, when displaying 10239 (which is really 9.999K),
+ // we want only a single place of precision for 10.0K. We could
+ // develop some complex heuristics for this, but it's much
+ // easier just to try each combination in turn.
+ int i;
+ for (i = 2; i >= 0; i--) {
+ if (snprintf(buffer, sizeof(buffer), "%.*f%c", i,
+ (double)b.v / (1ULL << 10 * index), u) <= 5)
+ break;
+ }
+ }
+
+ return out << buffer;
}
struct pretty_si_t {
diff --git a/src/test/cli-integration/rbd/formatted-output.t b/src/test/cli-integration/rbd/formatted-output.t
index 54c63733f25..2b05d720d6e 100644
--- a/src/test/cli-integration/rbd/formatted-output.t
+++ b/src/test/cli-integration/rbd/formatted-output.t
@@ -550,15 +550,15 @@ whenever it is run. grep -v to ignore it, but still work on other distros.
quuy
$ rbd list -l
- NAME SIZE PARENT FMT PROT LOCK
- foo 1024M 1
- foo@snap 1024M 1
- quux 1024k 1 excl
- bar 1024M 2
- bar@snap 512M 2 yes
- bar@snap2 1024M 2
- baz 2048M 2 shr
- quuy 2048M 2
+ NAME SIZE PARENT FMT PROT LOCK
+ foo 1G 1
+ foo@snap 1G 1
+ quux 1M 1 excl
+ bar 1G 2
+ bar@snap 512M 2 yes
+ bar@snap2 1G 2
+ baz 2G 2 shr
+ quuy 2G 2
$ rbd list -l --format json | python -mjson.tool | sed 's/,$/, /'
[
{
@@ -886,12 +886,12 @@ whenever it is run. grep -v to ignore it, but still work on other distros.
$ rbd disk-usage --pool rbd_other 2>/dev/null
- NAME PROVISIONED USED
- child@snap 512M 0
- child 512M 4096k
- deep-flatten-child@snap 512M 0
- deep-flatten-child 512M 0
- 1024M 4096k
+ NAME PROVISIONED USED
+ child@snap 512M 0
+ child 512M 4M
+ deep-flatten-child@snap 512M 0
+ deep-flatten-child 512M 0
+ 1G 4M
$ rbd disk-usage --pool rbd_other --format json | python -mjson.tool | sed 's/,$/, /'
{
"images": [