Illumos #1796, #2871, #2903, #2957
[zfs.git] / lib / libzfs / libzfs_config.c
index f1ddac9..b36dee1 100644 (file)
@@ -302,6 +302,48 @@ zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing)
 }
 
 /*
+ * If the __ZFS_POOL_RESTRICT environment variable is set we only iterate over
+ * pools it lists.
+ *
+ * This is an undocumented feature for use during testing only.
+ *
+ * This function returns B_TRUE if the pool should be skipped
+ * during iteration.
+ */
+static boolean_t
+check_restricted(const char *poolname)
+{
+       static boolean_t initialized = B_FALSE;
+       static char *restricted = NULL;
+
+       const char *cur, *end;
+       int len, namelen;
+
+       if (!initialized) {
+               initialized = B_TRUE;
+               restricted = getenv("__ZFS_POOL_RESTRICT");
+       }
+
+       if (NULL == restricted)
+               return (B_FALSE);
+
+       cur = restricted;
+       namelen = strlen(poolname);
+       do {
+               end = strchr(cur, ' ');
+               len = (NULL == end) ? strlen(cur) : (end - cur);
+
+               if (len == namelen && 0 == strncmp(cur, poolname, len)) {
+                       return (B_FALSE);
+               }
+
+               cur += (len + 1);
+       } while (NULL != end);
+
+       return (B_TRUE);
+}
+
+/*
  * Iterate over all pools in the system.
  */
 int
@@ -324,6 +366,9 @@ zpool_iter(libzfs_handle_t *hdl, zpool_iter_f func, void *data)
        for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL;
            cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) {
 
+               if (check_restricted(cn->cn_name))
+                       continue;
+
                if (zpool_open_silent(hdl, cn->cn_name, &zhp) != 0) {
                        hdl->libzfs_pool_iter--;
                        return (-1);
@@ -359,6 +404,9 @@ zfs_iter_root(libzfs_handle_t *hdl, zfs_iter_f func, void *data)
        for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL;
            cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) {
 
+               if (check_restricted(cn->cn_name))
+                       continue;
+
                if ((zhp = make_dataset_handle(hdl, cn->cn_name)) == NULL)
                        continue;