From 8b921f667afc86c452242be0b6d3b257472ebe76 Mon Sep 17 00:00:00 2001 From: Ralf Ertzinger Date: Wed, 23 Oct 2013 10:33:33 +0200 Subject: [PATCH] Introduce zpool_get_prop_literal interface This change introduces zpool_get_prop_literal. It's an expanded version of zpool_get_prop taking one additional boolean parameter. With this parameter set to B_FALSE it will behave identically to zpool_get_prop. Setting it to B_TRUE will return full precision numbers for the following properties: ZPOOL_PROP_SIZE ZPOOL_PROP_ALLOCATED ZPOOL_PROP_FREE ZPOOL_PROP_FREEING ZPOOL_PROP_EXPANDSZ ZPOOL_PROP_ASHIFT Also introduced is a wrapper function for zpool_get_prop making it use zpool_get_prop_literal in the background. Signed-off-by: Brian Behlendorf Issue #1813 --- include/libzfs.h | 2 ++ lib/libzfs/libzfs_pool.c | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/libzfs.h b/include/libzfs.h index 273286ceb8f5..c212a0c05a0c 100644 --- a/include/libzfs.h +++ b/include/libzfs.h @@ -281,6 +281,8 @@ extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, char *); extern int zpool_set_prop(zpool_handle_t *, const char *, const char *); extern int zpool_get_prop(zpool_handle_t *, zpool_prop_t, char *, size_t proplen, zprop_source_t *); +extern int zpool_get_prop_literal(zpool_handle_t *, zpool_prop_t, char *, + size_t proplen, zprop_source_t *, boolean_t literal); extern uint64_t zpool_get_prop_int(zpool_handle_t *, zpool_prop_t, zprop_source_t *); diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index e8e7efca5c08..8b3edec168d8 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -236,12 +236,22 @@ zpool_pool_state_to_name(pool_state_t state) } /* - * Get a zpool property value for 'prop' and return the value in - * a pre-allocated buffer. + * API compatibility wrapper around zpool_get_prop_literal */ int zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len, zprop_source_t *srctype) +{ + return zpool_get_prop_literal(zhp, prop, buf, len, srctype, B_FALSE); +} + +/* + * Get a zpool property value for 'prop' and return the value in + * a pre-allocated buffer. + */ +int +zpool_get_prop_literal(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len, + zprop_source_t *srctype, boolean_t literal) { uint64_t intval; const char *strval; @@ -308,7 +318,11 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len, case ZPOOL_PROP_FREEING: case ZPOOL_PROP_EXPANDSZ: case ZPOOL_PROP_ASHIFT: - (void) zfs_nicenum(intval, buf, len); + if (literal) + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + else + (void) zfs_nicenum(intval, buf, len); break; case ZPOOL_PROP_CAPACITY: