diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 6412a8e935b9..414ed69c57d0 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -4268,7 +4268,7 @@ print_pool(zpool_handle_t *zhp, list_cbdata_t *cb) static void print_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted, - boolean_t valid) + boolean_t valid, enum zfs_nicenum_format format) { char propval[64]; boolean_t fixed; @@ -4279,22 +4279,30 @@ print_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted, if (value == 0) (void) strlcpy(propval, "-", sizeof (propval)); else - zfs_nicenum(value, propval, sizeof (propval)); + zfs_nicenum_format(value, propval, sizeof (propval), + format); break; case ZPOOL_PROP_FRAGMENTATION: if (value == ZFS_FRAG_INVALID) { (void) strlcpy(propval, "-", sizeof (propval)); + } else if (format == ZFS_NICENUM_RAW) { + (void) snprintf(propval, sizeof (propval), "%llu", + (unsigned long long)value); } else { (void) snprintf(propval, sizeof (propval), "%llu%%", (unsigned long long)value); } break; case ZPOOL_PROP_CAPACITY: - (void) snprintf(propval, sizeof (propval), "%llu%%", - (unsigned long long)value); + if (format == ZFS_NICENUM_RAW) + (void) snprintf(propval, sizeof (propval), "%llu", + (unsigned long long)value); + else + (void) snprintf(propval, sizeof (propval), "%llu%%", + (unsigned long long)value); break; default: - zfs_nicenum(value, propval, sizeof (propval)); + zfs_nicenum_format(value, propval, sizeof (propval), format); } if (!valid) @@ -4325,6 +4333,12 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, if (name != NULL) { boolean_t toplevel = (vs->vs_space != 0); uint64_t cap; + enum zfs_nicenum_format format; + + if (cb->cb_literal) + format = ZFS_NICENUM_RAW; + else + format = ZFS_NICENUM_1024; if (scripted) (void) printf("\t%s", name); @@ -4341,19 +4355,21 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, * to indicate that the value is valid. */ print_one_column(ZPOOL_PROP_SIZE, vs->vs_space, scripted, - toplevel); + toplevel, format); print_one_column(ZPOOL_PROP_ALLOCATED, vs->vs_alloc, scripted, - toplevel); + toplevel, format); print_one_column(ZPOOL_PROP_FREE, vs->vs_space - vs->vs_alloc, - scripted, toplevel); + scripted, toplevel, format); print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize, scripted, - B_TRUE); + B_TRUE, format); print_one_column(ZPOOL_PROP_FRAGMENTATION, vs->vs_fragmentation, scripted, - (vs->vs_fragmentation != ZFS_FRAG_INVALID && toplevel)); + (vs->vs_fragmentation != ZFS_FRAG_INVALID && toplevel), + format); cap = (vs->vs_space == 0) ? 0 : (vs->vs_alloc * 100 / vs->vs_space); - print_one_column(ZPOOL_PROP_CAPACITY, cap, scripted, toplevel); + print_one_column(ZPOOL_PROP_CAPACITY, cap, scripted, toplevel, + format); (void) printf("\n"); } diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index 789df407c47b..8b74e5da6678 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -337,6 +337,9 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, case ZPOOL_PROP_FRAGMENTATION: if (intval == UINT64_MAX) { (void) strlcpy(buf, "-", len); + } else if (literal) { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); } else { (void) snprintf(buf, len, "%llu%%", (u_longlong_t)intval); @@ -344,9 +347,14 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, break; case ZPOOL_PROP_DEDUPRATIO: - (void) snprintf(buf, len, "%llu.%02llux", - (u_longlong_t)(intval / 100), - (u_longlong_t)(intval % 100)); + if (literal) + (void) snprintf(buf, len, "%llu.%02llu", + (u_longlong_t)(intval / 100), + (u_longlong_t)(intval % 100)); + else + (void) snprintf(buf, len, "%llu.%02llux", + (u_longlong_t)(intval / 100), + (u_longlong_t)(intval % 100)); break; case ZPOOL_PROP_HEALTH: