]> git.proxmox.com Git - mirror_zfs-debian.git/blobdiff - lib/libzfs/libzfs_pool.c
New upstream version 0.7.11
[mirror_zfs-debian.git] / lib / libzfs / libzfs_pool.c
index e00d5f51db9842998fcbddee760231673f16e728..76228d5730e62cb17a8b2032cbafde35126dba09 100644 (file)
@@ -238,6 +238,38 @@ zpool_pool_state_to_name(pool_state_t state)
        return (gettext("UNKNOWN"));
 }
 
+/*
+ * Given a pool handle, return the pool health string ("ONLINE", "DEGRADED",
+ * "SUSPENDED", etc).
+ */
+const char *
+zpool_get_state_str(zpool_handle_t *zhp)
+{
+       zpool_errata_t errata;
+       zpool_status_t status;
+       nvlist_t *nvroot;
+       vdev_stat_t *vs;
+       uint_t vsc;
+       const char *str;
+
+       status = zpool_get_status(zhp, NULL, &errata);
+
+       if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
+               str = gettext("FAULTED");
+       } else if (status == ZPOOL_STATUS_IO_FAILURE_WAIT ||
+           status == ZPOOL_STATUS_IO_FAILURE_MMP) {
+               str = gettext("SUSPENDED");
+       } else {
+               verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
+                   ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
+               verify(nvlist_lookup_uint64_array(nvroot,
+                   ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &vsc)
+                   == 0);
+               str = zpool_state_to_name(vs->vs_state, vs->vs_aux);
+       }
+       return (str);
+}
+
 /*
  * Get a zpool property value for 'prop' and return the value in
  * a pre-allocated buffer.
@@ -249,9 +281,6 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
        uint64_t intval;
        const char *strval;
        zprop_source_t src = ZPROP_SRC_NONE;
-       nvlist_t *nvroot;
-       vdev_stat_t *vs;
-       uint_t vsc;
 
        if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
                switch (prop) {
@@ -260,7 +289,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
                        break;
 
                case ZPOOL_PROP_HEALTH:
-                       (void) strlcpy(buf, "FAULTED", len);
+                       (void) strlcpy(buf, zpool_get_state_str(zhp), len);
                        break;
 
                case ZPOOL_PROP_GUID:
@@ -361,14 +390,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf,
                        break;
 
                case ZPOOL_PROP_HEALTH:
-                       verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
-                           ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
-                       verify(nvlist_lookup_uint64_array(nvroot,
-                           ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &vsc)
-                           == 0);
-
-                       (void) strlcpy(buf, zpool_state_to_name(intval,
-                           vs->vs_aux), len);
+                       (void) strlcpy(buf, zpool_get_state_str(zhp), len);
                        break;
                case ZPOOL_PROP_VERSION:
                        if (intval >= SPA_VERSION_FEATURES) {