Skip to content

Commit

Permalink
Illumos 5147 - zpool list -v should show individual disk capacity
Browse files Browse the repository at this point in the history
The 'zpool list -v' command displays lots of info but excludes the
capacity of each disk. This should be added.

Reviewed by: Christopher Siden christopher.siden@delphix.com
Reviewed by: Adam Leventhal adam.leventhal@delphix.com
Reviewed by: Matthew Ahrens matthew.ahrens@delphix.com

References:
  https://www.illumos.org/issues/5147
  illumos/illumos-gate@7a09f97

Ported by: Turbo Fredriksson <turbo@bayour.com>
  • Loading branch information
grwilson authored and FransUrbo committed Sep 17, 2014
1 parent 2d50158 commit 845e306
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 34 deletions.
83 changes: 51 additions & 32 deletions cmd/zpool/zpool_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2955,10 +2955,7 @@ print_pool(zpool_handle_t *zhp, list_cbdata_t *cb)

right_justify = B_FALSE;
if (pl->pl_prop != ZPROP_INVAL) {
if (pl->pl_prop == ZPOOL_PROP_EXPANDSZ &&
zpool_get_prop_int(zhp, pl->pl_prop, NULL) == 0)
propstr = "-";
else if (zpool_get_prop(zhp, pl->pl_prop, property,
if (zpool_get_prop(zhp, pl->pl_prop, property,
sizeof (property), NULL) != 0)
propstr = "-";
else
Expand Down Expand Up @@ -2992,22 +2989,38 @@ 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)
print_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted,
boolean_t valid)
{
char propval[64];
boolean_t fixed;
size_t width = zprop_width(prop, &fixed, ZFS_TYPE_POOL);


if (prop == ZPOOL_PROP_EXPANDSZ && value == 0)
(void) strlcpy(propval, "-", sizeof (propval));
else if (prop == ZPOOL_PROP_FRAGMENTATION && value == ZFS_FRAG_INVALID)
(void) strlcpy(propval, "-", sizeof (propval));
else if (prop == ZPOOL_PROP_FRAGMENTATION)
switch (prop) {
case ZPOOL_PROP_EXPANDSZ:
if (value == 0)
(void) strlcpy(propval, "-", sizeof (propval));
else
zfs_nicenum(value, propval, sizeof (propval));
break;
case ZPOOL_PROP_FRAGMENTATION:
if (value == ZFS_FRAG_INVALID) {
(void) strlcpy(propval, "-", sizeof (propval));
} else {
(void) snprintf(propval, sizeof (propval), "%" PRIu64 "%%",
value);
}
break;
case ZPOOL_PROP_CAPACITY:
(void) snprintf(propval, sizeof (propval), "%llu%%",
(unsigned long long)value);
else
break;
default:
zfs_nicenum(value, propval, sizeof (propval));
}

if (!valid)
(void) strlcpy(propval, "-", sizeof (propval));

if (scripted)
(void) printf("\t%s", propval);
Expand All @@ -3029,6 +3042,9 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
(uint64_t **)&vs, &c) == 0);

if (name != NULL) {
boolean_t toplevel = (vs->vs_space != 0);
uint64_t cap;

if (scripted)
(void) printf("\t%s", name);
else if (strlen(name) + depth > cb->cb_namewidth)
Expand All @@ -3037,24 +3053,26 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
(void) printf("%*s%s%*s", depth, "", name,
(int)(cb->cb_namewidth - strlen(name) - depth), "");

/* only toplevel vdevs have capacity stats */
if (vs->vs_space == 0) {
if (scripted)
(void) printf("\t-\t-\t-\t-");
else
(void) printf(" - - - -");
} else {
print_one_column(ZPOOL_PROP_SIZE, vs->vs_space,
scripted);
print_one_column(ZPOOL_PROP_CAPACITY, vs->vs_alloc,
scripted);
print_one_column(ZPOOL_PROP_FREE,
vs->vs_space - vs->vs_alloc, scripted);
print_one_column(ZPOOL_PROP_FRAGMENTATION,
vs->vs_fragmentation, scripted);
}
print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize,
scripted);
/*
* Print the properties for the individual vdevs. Some
* properties are only applicable to toplevel vdevs. The
* 'toplevel' boolean value is passed to the print_one_column()
* to indicate that the value is valid.
*/
print_one_column(ZPOOL_PROP_SIZE, vs->vs_space, scripted,
toplevel);
print_one_column(ZPOOL_PROP_ALLOCATED, vs->vs_alloc, scripted,
toplevel);
print_one_column(ZPOOL_PROP_FREE, vs->vs_space - vs->vs_alloc,
scripted, toplevel);
print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize, scripted,
B_TRUE);
print_one_column(ZPOOL_PROP_FRAGMENTATION,
vs->vs_fragmentation, scripted,
(vs->vs_fragmentation != ZFS_FRAG_INVALID && toplevel));
cap = (vs->vs_space == 0) ? 0 :
(vs->vs_alloc * 100 / vs->vs_space);
print_one_column(ZPOOL_PROP_CAPACITY, cap, scripted, toplevel);
(void) printf("\n");
}

Expand Down Expand Up @@ -3123,7 +3141,8 @@ list_callback(zpool_handle_t *zhp, void *data)
* -H Scripted mode. Don't display headers, and separate properties
* by a single tab.
* -o List of properties to display. Defaults to
* "name,size,allocated,free,capacity,health,altroot"
* "name,size,allocated,free,expandsize,fragmentation,capacity,"
* "dedupratio,health,altroot"
* -T Display a timestamp in date(1) or Unix format
*
* List all pools in the system, whether or not they're healthy. Output space
Expand All @@ -3136,7 +3155,7 @@ zpool_do_list(int argc, char **argv)
int ret = 0;
list_cbdata_t cb = { 0 };
static char default_props[] =
"name,size,allocated,free,fragmentation,capacity,"
"name,size,allocated,free,expandsize,fragmentation,capacity,"
"dedupratio,health,altroot";
char *props = default_props;
unsigned long interval = 0, count = 0;
Expand Down
14 changes: 12 additions & 2 deletions lib/libzfs/libzfs_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
*/

#include <ctype.h>
Expand Down Expand Up @@ -317,7 +317,6 @@ zpool_get_prop_literal(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
case ZPOOL_PROP_FREE:
case ZPOOL_PROP_FREEING:
case ZPOOL_PROP_LEAKED:
case ZPOOL_PROP_EXPANDSZ:
case ZPOOL_PROP_ASHIFT:
if (literal)
(void) snprintf(buf, len, "%llu",
Expand All @@ -326,6 +325,17 @@ zpool_get_prop_literal(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
(void) zfs_nicenum(intval, buf, len);
break;

case ZPOOL_PROP_EXPANDSZ:
if (intval == 0) {
(void) strlcpy(buf, "-", len);
} else if (literal) {
(void) snprintf(buf, len, "%llu",
(u_longlong_t)intval);
} else {
(void) zfs_nicenum(intval, buf, len);
}
break;

case ZPOOL_PROP_CAPACITY:
(void) snprintf(buf, len, "%llu%%",
(u_longlong_t)intval);
Expand Down

0 comments on commit 845e306

Please sign in to comment.