OpenZFS 4521 - zfstest is trying to execute evil "zfs unmount -a"

Authored by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Andriy Gapon <avg@FreeBSD.org>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>

Porting Notes:
- Correctly set __ZFS_POOL_RESTRICT in inherit_001_pos

OpenZFS-issue: https://www.illumos.org/issues/4521
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/8808ac5
Closes #5674
This commit is contained in:
Giuseppe Di Natale
2017-02-03 13:24:44 -08:00
committed by Brian Behlendorf
parent 9b7b9cd370
commit d21d5b8248
6 changed files with 52 additions and 14 deletions
+25 -10
View File
@@ -27,6 +27,7 @@
/*
* Copyright (c) 2012 by Delphix. All rights reserved.
* Copyright (c) 2015 by Syneto S.R.L. All rights reserved.
* Copyright 2016 Nexenta Systems, Inc.
*/
/*
@@ -326,33 +327,47 @@ 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.
* The following environment variables are undocumented
* and should be used for testing purposes only:
*
* This is an undocumented feature for use during testing only.
* __ZFS_POOL_EXCLUDE - don't iterate over the pools it lists
* __ZFS_POOL_RESTRICT - iterate only over the pools it lists
*
* This function returns B_TRUE if the pool should be skipped
* during iteration.
*/
static boolean_t
check_restricted(const char *poolname)
boolean_t
zpool_skip_pool(const char *poolname)
{
static boolean_t initialized = B_FALSE;
static char *restricted = NULL;
static const char *exclude = NULL;
static const char *restricted = NULL;
const char *cur, *end;
int len, namelen;
int len;
int namelen = strlen(poolname);
if (!initialized) {
initialized = B_TRUE;
exclude = getenv("__ZFS_POOL_EXCLUDE");
restricted = getenv("__ZFS_POOL_RESTRICT");
}
if (exclude != NULL) {
cur = exclude;
do {
end = strchr(cur, ' ');
len = (NULL == end) ? strlen(cur) : (end - cur);
if (len == namelen && 0 == strncmp(cur, poolname, len))
return (B_TRUE);
cur += (len + 1);
} while (NULL != end);
}
if (NULL == restricted)
return (B_FALSE);
cur = restricted;
namelen = strlen(poolname);
do {
end = strchr(cur, ' ');
len = (NULL == end) ? strlen(cur) : (end - cur);
@@ -390,7 +405,7 @@ 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))
if (zpool_skip_pool(cn->cn_name))
continue;
if (zpool_open_silent(hdl, cn->cn_name, &zhp) != 0) {
@@ -428,7 +443,7 @@ 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))
if (zpool_skip_pool(cn->cn_name))
continue;
if ((zhp = make_dataset_handle(hdl, cn->cn_name)) == NULL)
+10 -1
View File
@@ -27,7 +27,7 @@
* Copyright (c) 2012 Pawel Jakub Dawidek <pawel@dawidek.net>.
* Copyright (c) 2013 Martin Matuska. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright 2016 Nexenta Systems, Inc.
*/
#include <ctype.h>
@@ -3052,6 +3052,15 @@ zfs_get_name(const zfs_handle_t *zhp)
return (zhp->zfs_name);
}
/*
* Returns the name of the parent pool for the given zfs handle.
*/
const char *
zfs_get_pool_name(const zfs_handle_t *zhp)
{
return (zhp->zpool_hdl->zpool_name);
}
/*
* Returns the type of the given zfs handle.
*/