]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fragmentation should display as '-' if spacemap_histogram=disabled
authorilovezfs <ilovezfs@icloud.com>
Fri, 5 Sep 2014 06:06:55 +0000 (23:06 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 5 Sep 2014 16:19:01 +0000 (09:19 -0700)
When com.delphix:spacemap_histogram is disabled, the value of
fragmentation was printing as 18446744073709551615 (UINT64_MAX),
when it should print as '-'.

The issue was caused by a small mistake during the merge of
"4980 metaslabs should have a fragmentation metric."

upstream: https://github.com/illumos/illumos-gate/commit/2e4c998
ZoL: https://github.com/zfsonlinux/zfs/commit/f3a7f66

The problem is in zpool_get_prop_literal, where the handling of the
pool property ZPOOL_PROP_FRAGMENTATION was added to wrong the
section. In particular, ZPOOL_PROP_FRAGMENTATION should not be in
the section where zpool_get_state(zhp) == POOL_STATE_UNAVAIL, but
lower down after it's already been determined that the pool is in
fact available, which is where upstream illumos correctly has had
it.

Thanks to lundman for helping to track down this bug.

Signed-off-by: Jorgen Lundman <lundman@lundman.net>
Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2664

lib/libzfs/libzfs_pool.c

index 5be231f77e66b948aa3116ab32922cc3609f43c7..d50b9c9ccf17d5e95ac8f78a0ca3546f2cc1a27b 100644 (file)
@@ -274,15 +274,6 @@ zpool_get_prop_literal(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
                        intval = zpool_get_prop_int(zhp, prop, &src);
                        (void) snprintf(buf, len, "%llu", (u_longlong_t)intval);
                        break;
-               case ZPOOL_PROP_FRAGMENTATION:
-                       intval = zpool_get_prop_int(zhp, prop, &src);
-                       if (intval == UINT64_MAX) {
-                               (void) strlcpy(buf, "-", len);
-                       } else {
-                               (void) snprintf(buf, len, "%llu%%",
-                                   (u_longlong_t)intval);
-                       }
-                       break;
 
                case ZPOOL_PROP_ALTROOT:
                case ZPOOL_PROP_CACHEFILE:
@@ -340,6 +331,15 @@ zpool_get_prop_literal(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
                            (u_longlong_t)intval);
                        break;
 
+               case ZPOOL_PROP_FRAGMENTATION:
+                       if (intval == UINT64_MAX) {
+                               (void) strlcpy(buf, "-", len);
+                       } else {
+                               (void) snprintf(buf, len, "%llu%%",
+                                   (u_longlong_t)intval);
+                       }
+                       break;
+
                case ZPOOL_PROP_DEDUPRATIO:
                        (void) snprintf(buf, len, "%llu.%02llux",
                            (u_longlong_t)(intval / 100),