Illumos #2619 and #2747
[zfs.git] / lib / libzfs / libzfs_config.c
index b36dee1..ee94fe1 100644 (file)
  *
  * CDDL HEADER END
  */
+
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 /*
+ * Copyright (c) 2012 by Delphix. All rights reserved.
+ */
+
+/*
  * The pool configuration repository is stored in /etc/zfs/zpool.cache as a
  * single packed nvlist.  While it would be nice to just read in this
  * file from userland, this wouldn't work from a local zone.  So we have to have
@@ -218,6 +223,36 @@ zpool_get_config(zpool_handle_t *zhp, nvlist_t **oldconfig)
 }
 
 /*
+ * Retrieves a list of enabled features and their refcounts and caches it in
+ * the pool handle.
+ */
+nvlist_t *
+zpool_get_features(zpool_handle_t *zhp)
+{
+       nvlist_t *config, *features;
+
+       config = zpool_get_config(zhp, NULL);
+
+       if (config == NULL || !nvlist_exists(config,
+           ZPOOL_CONFIG_FEATURE_STATS)) {
+               int error;
+               boolean_t missing = B_FALSE;
+
+               error = zpool_refresh_stats(zhp, &missing);
+
+               if (error != 0 || missing)
+                       return (NULL);
+
+               config = zpool_get_config(zhp, NULL);
+       }
+
+       verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_FEATURE_STATS,
+           &features) == 0);
+
+       return (features);
+}
+
+/*
  * Refresh the vdev statistics associated with the given pool.  This is used in
  * iostat to show configuration changes and determine the delta from the last
  * time the function was called.  This function can fail, in case the pool has