Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Jul 2012 12:37:34 +0000 (UTC)
From:      Martin Matuska <mm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238422 - in head/cddl/contrib/opensolaris: cmd/zfs lib/libzfs/common
Message-ID:  <201207131237.q6DCbYDt069228@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mm
Date: Fri Jul 13 12:37:34 2012
New Revision: 238422
URL: http://svn.freebsd.org/changeset/base/238422

Log:
  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

Modified:
  head/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
Directory Properties:
  head/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: head/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c	Fri Jul 13 11:08:37 2012	(r238421)
+++ head/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c	Fri Jul 13 12:37:34 2012	(r238422)
@@ -1092,7 +1092,7 @@ snapshot_to_nvl_cb(zfs_handle_t *zhp, vo
 	int err = 0;
 
 	/* Check for clones. */
-	if (!cb->cb_doclones) {
+	if (!cb->cb_doclones && !cb->cb_defer_destroy) {
 		cb->cb_target = zhp;
 		cb->cb_first = B_TRUE;
 		err = zfs_iter_dependents(zhp, B_TRUE,

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c	Fri Jul 13 11:08:37 2012	(r238421)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_config.c	Fri Jul 13 12:37:34 2012	(r238422)
@@ -337,6 +337,48 @@ zpool_refresh_stats(zpool_handle_t *zhp,
 }
 
 /*
+ * 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_i
 	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_
 	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;
 

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Fri Jul 13 11:08:37 2012	(r238421)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Fri Jul 13 12:37:34 2012	(r238422)
@@ -3138,7 +3138,8 @@ zfs_create(libzfs_handle_t *hdl, const c
 
 /*
  * Destroys the given dataset.  The caller must make sure that the filesystem
- * isn't mounted, and that there are no active dependents.
+ * isn't mounted, and that there are no active dependents. If the file system
+ * does not exist this function does nothing.
  */
 int
 zfs_destroy(zfs_handle_t *zhp, boolean_t defer)
@@ -3154,7 +3155,8 @@ zfs_destroy(zfs_handle_t *zhp, boolean_t
 	}
 
 	zc.zc_defer_destroy = defer;
-	if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_DESTROY, &zc) != 0) {
+	if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_DESTROY, &zc) != 0 &&
+	    errno != ENOENT) {
 		return (zfs_standard_error_fmt(zhp->zfs_hdl, errno,
 		    dgettext(TEXT_DOMAIN, "cannot destroy '%s'"),
 		    zhp->zfs_name));

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Fri Jul 13 11:08:37 2012	(r238421)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Fri Jul 13 12:37:34 2012	(r238422)
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 by Delphix. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  * Copyright (c) 2012 Pawel Jakub Dawidek <pawel@dawidek.net>.
  * All rights reserved.
@@ -1387,7 +1387,6 @@ zfs_send(zfs_handle_t *zhp, const char *
 	avl_tree_t *fsavl = NULL;
 	static uint64_t holdseq;
 	int spa_version;
-	boolean_t holdsnaps = B_FALSE;
 	pthread_t tid;
 	int pipefd[2];
 	dedup_arg_t dda = { 0 };
@@ -1410,11 +1409,6 @@ zfs_send(zfs_handle_t *zhp, const char *
 		}
 	}
 
-	if (!flags->dryrun && zfs_spa_version(zhp, &spa_version) == 0 &&
-	    spa_version >= SPA_VERSION_USERREFS &&
-	    (flags->doall || flags->replicate))
-		holdsnaps = B_TRUE;
-
 	if (flags->dedup && !flags->dryrun) {
 		featureflags |= (DMU_BACKUP_FEATURE_DEDUP |
 		    DMU_BACKUP_FEATURE_DEDUPPROPS);
@@ -1536,7 +1530,18 @@ zfs_send(zfs_handle_t *zhp, const char *
 	sdd.filter_cb_arg = cb_arg;
 	if (debugnvp)
 		sdd.debugnv = *debugnvp;
-	if (holdsnaps || flags->progress) {
+
+	/*
+	 * Some flags require that we place user holds on the datasets that are
+	 * being sent so they don't get destroyed during the send. We can skip
+	 * this step if the pool is imported read-only since the datasets cannot
+	 * be destroyed.
+	 */
+	if (!flags->dryrun && !zpool_get_prop_int(zfs_get_pool_handle(zhp),
+	    ZPOOL_PROP_READONLY, NULL) &&
+	    zfs_spa_version(zhp, &spa_version) == 0 &&
+	    spa_version >= SPA_VERSION_USERREFS &&
+	    (flags->doall || flags->replicate)) {
 		++holdseq;
 		(void) snprintf(sdd.holdtag, sizeof (sdd.holdtag),
 		    ".send-%d-%llu", getpid(), (u_longlong_t)holdseq);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207131237.q6DCbYDt069228>