Skip to content

Commit

Permalink
libzutil: allow to display powers of 1000 bytes
Browse files Browse the repository at this point in the history
ZFS displays bytes with K/M/G/T/P/E prefixes. They represent powers of
1024 bytes, i.e. KiB, MiB, GiB, TiB, PiB, EiB.
Some users may want these prefixes to represent powers of 1000 bytes,
i.e. KB, MB, GB, TB, PB, EB.
This adds the new unit format and allows to use such display by
defining an environment variable.

Signed-off-by: Julien Cassette <[email protected]>
  • Loading branch information
jcassette committed Nov 11, 2024
1 parent 57fc597 commit a8980aa
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 6 deletions.
4 changes: 3 additions & 1 deletion include/libzutil.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,13 +144,15 @@ _LIBZUTIL_H boolean_t zfs_isnumber(const char *);
* ZFS_NICENUM_TIME: Print nanosecs, microsecs, millisecs, seconds...
* ZFS_NICENUM_RAW: Print the raw number without any formatting
* ZFS_NICENUM_RAWTIME: Same as RAW, but print dashes ('-') for zero.
* ZFS_NICENUM_1000: Same as ZFS_NICENUM_BYTES but use powers of 1000.
*/
enum zfs_nicenum_format {
ZFS_NICENUM_1024 = 0,
ZFS_NICENUM_BYTES = 1,
ZFS_NICENUM_TIME = 2,
ZFS_NICENUM_RAW = 3,
ZFS_NICENUM_RAWTIME = 4
ZFS_NICENUM_RAWTIME = 4,
ZFS_NICENUM_1000 = 5
};

/*
Expand Down
18 changes: 13 additions & 5 deletions lib/libzutil/zutil_nicenum.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <libzutil.h>
#include <string.h>

Expand Down Expand Up @@ -64,19 +65,22 @@ zfs_nicenum_format(uint64_t num, char *buf, size_t buflen,
uint64_t n = num;
int index = 0;
const char *u;
const char *units[3][7] = {
const char *units[6][7] = {
[ZFS_NICENUM_1024] = {"", "K", "M", "G", "T", "P", "E"},
[ZFS_NICENUM_BYTES] = {"B", "K", "M", "G", "T", "P", "E"},
[ZFS_NICENUM_TIME] = {"ns", "us", "ms", "s", "?", "?", "?"}
[ZFS_NICENUM_TIME] = {"ns", "us", "ms", "s", "?", "?", "?"},
[ZFS_NICENUM_1000] = {"B", "K", "M", "G", "T", "P", "E"}
};

const int units_len[] = {[ZFS_NICENUM_1024] = 6,
[ZFS_NICENUM_BYTES] = 6,
[ZFS_NICENUM_TIME] = 4};
[ZFS_NICENUM_TIME] = 4,
[ZFS_NICENUM_1000] = 6};

const int k_unit[] = { [ZFS_NICENUM_1024] = 1024,
[ZFS_NICENUM_BYTES] = 1024,
[ZFS_NICENUM_TIME] = 1000};
[ZFS_NICENUM_TIME] = 1000,
[ZFS_NICENUM_1000] = 1000};

double val;

Expand Down Expand Up @@ -180,5 +184,9 @@ zfs_niceraw(uint64_t num, char *buf, size_t buflen)
void
zfs_nicebytes(uint64_t num, char *buf, size_t buflen)
{
zfs_nicenum_format(num, buf, buflen, ZFS_NICENUM_BYTES);
if (getenv("ZFS_OUTPUT_BYTES_SI") != NULL) {
zfs_nicenum_format(num, buf, buflen, ZFS_NICENUM_1000);
} else {
zfs_nicenum_format(num, buf, buflen, ZFS_NICENUM_BYTES);
}
}
9 changes: 9 additions & 0 deletions man/man8/zdb.8
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,15 @@ refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
dedup = 1.11, compress = 1.80, copies = 1.00, dedup * compress / copies = 2.00
.Ed
.
.Sh ENVIRONMENT VARIABLES
.Bl -tag -width "ZFS_OUTPUT_BYTES_SI"
.\" Shared with zfs.8 and zpool.8
.It Sy ZFS_OUTPUT_BYTES_SI
Make K/M/G/T/P/E prefixes in
.Nm zdb
output to represent powers of 1000 bytes, i.e. KB, MB, GB, TB, PB, EB.
.El
.
.Sh SEE ALSO
.Xr zfs 8 ,
.Xr zpool 8
6 changes: 6 additions & 0 deletions man/man8/zfs.8
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,12 @@ to set the maximum pipe size for sends/recieves.
Disabled by default on Linux
due to an unfixed deadlock in Linux's pipe size handling code.
.
.\" Shared with zdb.8 and zpool.8
.It Sy ZFS_OUTPUT_BYTES_SI
Make K/M/G/T/P/E prefixes in
.Nm zfs
output to represent powers of 1000 bytes, i.e. KB, MB, GB, TB, PB, EB.
.
.\" Shared with zpool.8
.It Sy ZFS_MODULE_TIMEOUT
Time, in seconds, to wait for
Expand Down
6 changes: 6 additions & 0 deletions man/man8/zpool.8
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,12 @@ If
.Sy ZPOOL_SCRIPTS_ENABLED
is not set, it is assumed that the user is allowed to run
.Nm zpool Cm status Ns / Ns Cm iostat Fl c .
.\" Shared with zdb.8 and zfs.8
.It Sy ZFS_OUTPUT_BYTES_SI
Make K/M/G/T/P/E prefixes in
.Nm zpool
output to represent powers of 1000 bytes, i.e. KB, MB, GB, TB, PB, EB.
.
.\" Shared with zfs.8
.It Sy ZFS_MODULE_TIMEOUT
Time, in seconds, to wait for
Expand Down

0 comments on commit a8980aa

Please sign in to comment.