diff options
author | mm <mm@FreeBSD.org> | 2012-07-13 12:37:34 +0000 |
---|---|---|
committer | mm <mm@FreeBSD.org> | 2012-07-13 12:37:34 +0000 |
commit | 98fa6a1cdbda0168d4fbbf91839fd17b4f842873 (patch) | |
tree | 0b26862b3421ec92b92c483a3af03f3ae2c00c67 /cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c | |
parent | 73c1cd9e1135a5f68cebf28e8d0b1353df844fa8 (diff) | |
download | FreeBSD-src-98fa6a1cdbda0168d4fbbf91839fd17b4f842873.zip FreeBSD-src-98fa6a1cdbda0168d4fbbf91839fd17b4f842873.tar.gz |
Merge illumos commit 13749:df4cd82e2b60
1796 "ZFS HOLD" should not be used when doing "ZFS SEND" froma read-only pool
2871 support for __ZFS_POOL_RESTRICT used by ZFS test suite
2903 zfs destroy -d does not work
2957 zfs destroy -R/r sometimes fails when removing defer-destroyed snapshot
References:
https://www.illumos.org/issues/1796
https://www.illumos.org/issues/2871
https://www.illumos.org/issues/2903
https://www.illumos.org/issues/2957
MFC after: 1 week
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c index f756da2..d5ba20f 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c @@ -337,6 +337,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 @@ -359,6 +401,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); @@ -394,6 +439,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; |