Bug 146471 - [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)
Summary: [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: Martin Matuska
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-05-10 16:50 UTC by Martin Matuska
Modified: 2010-05-14 19:44 UTC (History)
1 user (show)

See Also:


Attachments
file.diff (7.10 KB, patch)
2010-05-10 16:50 UTC, Martin Matuska
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Martin Matuska freebsd_committer freebsd_triage 2010-05-10 16:50:01 UTC
Fix OpenSolaris bugs #6784757, #6784924, #6826861

OpenSolaris revision 8517:41a0783dde17
6784757  zfs rename occasionally fails with ebusy

OpenSolaris revision 8779:f164e0e90508
6784924  panic while ludelete (zfs destroy)

OpenSolaris revision 9390:887948510f80
6826861  assertion failed in dsl_dataset_destroy_sync when "zfs destroy" old fs

Patch applies cleanly.

References:
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784757
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784924
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6826861
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2010-05-10 17:16:38 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-fs

Over to maintainer(s).
Comment 2 Pawel Jakub Dawidek freebsd_committer freebsd_triage 2010-05-11 08:48:05 UTC
On Mon, May 10, 2010 at 05:41:30PM +0200, Martin Matuska wrote:
> 
> >Submitter-Id:	current-users
> >Originator:	Martin Matuska
> >Organization:
> >Confidential:	no
> >Synopsis:	[zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)
> >Severity:	non-critical
> >Priority:	low
> >Category:	kern
> >Class:		sw-bug
> >Release:	FreeBSD 9-CURRENT amd64
> >Environment:
> >Description:
> Fix OpenSolaris bugs #6784757, #6784924, #6826861
> 
> OpenSolaris revision 8517:41a0783dde17
> 6784757  zfs rename occasionally fails with ebusy
> 
> OpenSolaris revision 8779:f164e0e90508
> 6784924  panic while ludelete (zfs destroy)
> 
> OpenSolaris revision 9390:887948510f80
> 6826861  assertion failed in dsl_dataset_destroy_sync when "zfs destroy" old fs
> 
> Patch applies cleanly.


Looks good, go ahead.

> References:
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784757
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784924
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6826861
> 
> >How-To-Repeat:
> >Fix:
> Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
> ===================================================================
> --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revision 207846)
> +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(working copy)
> @@ -19,7 +19,7 @@
>   * CDDL HEADER END
>   */
>  /*
> - * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> + * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
>   * Use is subject to license terms.
>   */
>  
> @@ -2205,6 +2205,12 @@
>  	err = dsl_dir_open(oldname, FTAG, &dd, &tail);
>  	if (err)
>  		return (err);
> +	/*
> +	 * If there are more than 2 references there may be holds
> +	 * hanging around that haven't been cleared out yet.
> +	 */
> +	if (dmu_buf_refcount(dd->dd_dbuf) > 2)
> +		txg_wait_synced(dd->dd_pool, 0);
>  	if (tail == NULL) {
>  		int delta = strlen(newname) - strlen(oldname);
>  
> Index: cddl/contrib/opensolaris/cmd/ztest/ztest.c
> ===================================================================
> --- cddl/contrib/opensolaris/cmd/ztest/ztest.c	(revision 207846)
> +++ cddl/contrib/opensolaris/cmd/ztest/ztest.c	(working copy)
> @@ -19,7 +19,7 @@
>   * CDDL HEADER END
>   */
>  /*
> - * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> + * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
>   * Use is subject to license terms.
>   */
>  
> @@ -93,6 +93,7 @@
>  #include <sys/vdev_file.h>
>  #include <sys/spa_impl.h>
>  #include <sys/dsl_prop.h>
> +#include <sys/dsl_dataset.h>
>  #include <sys/refcount.h>
>  #include <stdio.h>
>  #include <stdio_ext.h>
> @@ -174,6 +175,7 @@
>  ztest_func_t ztest_dsl_prop_get_set;
>  ztest_func_t ztest_dmu_objset_create_destroy;
>  ztest_func_t ztest_dmu_snapshot_create_destroy;
> +ztest_func_t ztest_dsl_dataset_promote_busy;
>  ztest_func_t ztest_spa_create_destroy;
>  ztest_func_t ztest_fault_inject;
>  ztest_func_t ztest_spa_rename;
> @@ -208,6 +210,7 @@
>  	{ ztest_dsl_prop_get_set,		1,	&zopt_sometimes	},
>  	{ ztest_dmu_objset_create_destroy,	1,	&zopt_sometimes },
>  	{ ztest_dmu_snapshot_create_destroy,	1,	&zopt_sometimes },
> +	{ ztest_dsl_dataset_promote_busy,	1,	&zopt_sometimes },
>  	{ ztest_spa_create_destroy,		1,	&zopt_sometimes },
>  	{ ztest_fault_inject,			1,	&zopt_sometimes	},
>  	{ ztest_spa_rename,			1,	&zopt_rarely	},
> @@ -1591,6 +1594,109 @@
>  }
>  
>  /*
> + * Verify dsl_dataset_promote handles EBUSY
> + */
> +void
> +ztest_dsl_dataset_promote_busy(ztest_args_t *za)
> +{
> +	int error;
> +	objset_t *os = za->za_os;
> +	objset_t *clone;
> +	dsl_dataset_t *ds;
> +	char snap1name[100];
> +	char clone1name[100];
> +	char snap2name[100];
> +	char clone2name[100];
> +	char snap3name[100];
> +	char osname[MAXNAMELEN];
> +	static uint64_t uniq = 0;
> +	uint64_t curval;
> +
> +	curval = atomic_add_64_nv(&uniq, 5) - 5;
> +
> +	(void) rw_rdlock(&ztest_shared->zs_name_lock);
> +
> +	dmu_objset_name(os, osname);
> +	(void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++);
> +	(void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++);
> +	(void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++);
> +	(void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++);
> +	(void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++);
> +
> +	error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE);
> +	if (error == ENOSPC)
> +		ztest_record_enospc("dmu_take_snapshot");
> +	else if (error != 0 && error != EEXIST)
> +		fatal(0, "dmu_take_snapshot = %d", error);
> +
> +	error = dmu_objset_open(snap1name, DMU_OST_OTHER,
> +	    DS_MODE_USER | DS_MODE_READONLY, &clone);
> +	if (error)
> +		fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error);
> +
> +	error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0,
> +	    NULL, NULL);
> +	if (error)
> +		fatal(0, "dmu_objset_create(%s) = %d", clone1name, error);
> +	dmu_objset_close(clone);
> +
> +	error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
> +	    FALSE);
> +	if (error == ENOSPC)
> +		ztest_record_enospc("dmu_take_snapshot");
> +	else if (error != 0 && error != EEXIST)
> +		fatal(0, "dmu_take_snapshot = %d", error);
> +
> +	error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
> +	    FALSE);
> +	if (error == ENOSPC)
> +		ztest_record_enospc("dmu_take_snapshot");
> +	else if (error != 0 && error != EEXIST)
> +		fatal(0, "dmu_take_snapshot = %d", error);
> +
> +	error = dmu_objset_open(snap3name, DMU_OST_OTHER,
> +	    DS_MODE_USER | DS_MODE_READONLY, &clone);
> +	if (error)
> +		fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
> +
> +	error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0,
> +	    NULL, NULL);
> +	if (error)
> +		fatal(0, "dmu_objset_create(%s) = %d", clone2name, error);
> +	dmu_objset_close(clone);
> +
> +	error = dsl_dataset_own(snap1name, 0, FTAG, &ds);
> +	if (error)
> +		fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error);
> +	error = dsl_dataset_promote(clone2name);
> +	if (error != EBUSY)
> +		fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
> +		    error);
> +	dsl_dataset_disown(ds, FTAG);
> +
> +	error = dmu_objset_destroy(clone2name);
> +	if (error)
> +		fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error);
> +
> +	error = dmu_objset_destroy(snap3name);
> +	if (error)
> +		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
> +
> +	error = dmu_objset_destroy(snap2name);
> +	if (error)
> +		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
> +
> +	error = dmu_objset_destroy(clone1name);
> +	if (error)
> +		fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error);
> +	error = dmu_objset_destroy(snap1name);
> +	if (error)
> +		fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error);
> +
> +	(void) rw_unlock(&ztest_shared->zs_name_lock);
> +}
> +
> +/*
>   * Verify that dmu_object_{alloc,free} work as expected.
>   */
>  void
> Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
> ===================================================================
> --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revision 207846)
> +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(working copy)
> @@ -554,6 +554,7 @@
>  		return (err);
>  	if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) {
>  		dsl_dataset_rele(*dsp, owner);
> +		*dsp = NULL;
>  		return (EBUSY);
>  	}
>  	return (0);
> @@ -2578,7 +2579,7 @@
>  {
>  	struct promotenode *snap;
>  
> -	if (!list_link_active(&l->list_head))
> +	if (!l || !list_link_active(&l->list_head))
>  		return;
>  
>  	while ((snap = list_tail(l)) != NULL) {
> Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
> ===================================================================
> --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revision 207846)
> +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(working copy)
> @@ -1267,8 +1267,7 @@
>  		(void) zio_wait(zio);
>  	}
>  
> -	ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) ||
> -	    ds->ds_phys->ds_unique_bytes == 0);
> +	ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0);
>  
>  	if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) {
>  		/* Change our contents to that of the prev snapshot */
> @@ -1660,7 +1659,7 @@
>  		err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
>  		    ADVANCE_POST, kill_blkptr, &ka);
>  		ASSERT3U(err, ==, 0);
> -		ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE ||
> +		ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
>  		    ds->ds_phys->ds_unique_bytes == 0);
>  	}


-- 
Pawel Jakub Dawidek                       http://www.wheelsystems.com
pjd@FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!
Comment 3 dfilter service freebsd_committer freebsd_triage 2010-05-11 10:19:55 UTC
Author: mm
Date: Tue May 11 09:19:41 2010
New Revision: 207909
URL: http://svn.freebsd.org/changeset/base/207909

Log:
  Fix zfs rename (may occasionally fail with dataset busy).
  
  OpenSolaris onnv revision:	8517:41a0783dde17
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784757)
  MFC after:	3 days

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 07:25:13 2010	(r207908)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 09:19:41 2010	(r207909)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const 
 	err = dsl_dir_open(oldname, FTAG, &dd, &tail);
 	if (err)
 		return (err);
+	/*
+	 * If there are more than 2 references there may be holds
+	 * hanging around that haven't been cleared out yet.
+	 */
+	if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+		txg_wait_synced(dd->dd_pool, 0);
 	if (tail == NULL) {
 		int delta = strlen(newname) - strlen(oldname);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 4 dfilter service freebsd_committer freebsd_triage 2010-05-11 10:24:01 UTC
Author: mm
Date: Tue May 11 09:23:46 2010
New Revision: 207910
URL: http://svn.freebsd.org/changeset/base/207910

Log:
  Fix possible panic with zfs destroy.
  
  OpenSolaris onnv revision:	8779:f164e0e90508
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784924)
  MFC after:	3 days

Modified:
  head/cddl/contrib/opensolaris/cmd/ztest/ztest.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c

Modified: head/cddl/contrib/opensolaris/cmd/ztest/ztest.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Tue May 11 09:19:41 2010	(r207909)
+++ head/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Tue May 11 09:23:46 2010	(r207910)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -93,6 +93,7 @@
 #include <sys/vdev_file.h>
 #include <sys/spa_impl.h>
 #include <sys/dsl_prop.h>
+#include <sys/dsl_dataset.h>
 #include <sys/refcount.h>
 #include <stdio.h>
 #include <stdio_ext.h>
@@ -174,6 +175,7 @@ ztest_func_t ztest_traverse;
 ztest_func_t ztest_dsl_prop_get_set;
 ztest_func_t ztest_dmu_objset_create_destroy;
 ztest_func_t ztest_dmu_snapshot_create_destroy;
+ztest_func_t ztest_dsl_dataset_promote_busy;
 ztest_func_t ztest_spa_create_destroy;
 ztest_func_t ztest_fault_inject;
 ztest_func_t ztest_spa_rename;
@@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = {
 	{ ztest_dsl_prop_get_set,		1,	&zopt_sometimes	},
 	{ ztest_dmu_objset_create_destroy,	1,	&zopt_sometimes },
 	{ ztest_dmu_snapshot_create_destroy,	1,	&zopt_sometimes },
+	{ ztest_dsl_dataset_promote_busy,	1,	&zopt_sometimes },
 	{ ztest_spa_create_destroy,		1,	&zopt_sometimes },
 	{ ztest_fault_inject,			1,	&zopt_sometimes	},
 	{ ztest_spa_rename,			1,	&zopt_rarely	},
@@ -1591,6 +1594,109 @@ ztest_traverse(ztest_args_t *za)
 }
 
 /*
+ * Verify dsl_dataset_promote handles EBUSY
+ */
+void
+ztest_dsl_dataset_promote_busy(ztest_args_t *za)
+{
+	int error;
+	objset_t *os = za->za_os;
+	objset_t *clone;
+	dsl_dataset_t *ds;
+	char snap1name[100];
+	char clone1name[100];
+	char snap2name[100];
+	char clone2name[100];
+	char snap3name[100];
+	char osname[MAXNAMELEN];
+	static uint64_t uniq = 0;
+	uint64_t curval;
+
+	curval = atomic_add_64_nv(&uniq, 5) - 5;
+
+	(void) rw_rdlock(&ztest_shared->zs_name_lock);
+
+	dmu_objset_name(os, osname);
+	(void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++);
+	(void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++);
+	(void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++);
+	(void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++);
+	(void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++);
+
+	error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap1name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error);
+
+	error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone1name, error);
+	dmu_objset_close(clone);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap3name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
+
+	error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone2name, error);
+	dmu_objset_close(clone);
+
+	error = dsl_dataset_own(snap1name, 0, FTAG, &ds);
+	if (error)
+		fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error);
+	error = dsl_dataset_promote(clone2name);
+	if (error != EBUSY)
+		fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
+		    error);
+	dsl_dataset_disown(ds, FTAG);
+
+	error = dmu_objset_destroy(clone2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error);
+
+	error = dmu_objset_destroy(snap3name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(snap2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(clone1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error);
+	error = dmu_objset_destroy(snap1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error);
+
+	(void) rw_unlock(&ztest_shared->zs_name_lock);
+}
+
+/*
  * Verify that dmu_object_{alloc,free} work as expected.
  */
 void

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 09:19:41 2010	(r207909)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 09:23:46 2010	(r207910)
@@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint
 		return (err);
 	if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) {
 		dsl_dataset_rele(*dsp, owner);
+		*dsp = NULL;
 		return (EBUSY);
 	}
 	return (0);
@@ -2584,7 +2585,7 @@ snaplist_destroy(list_t *l, boolean_t ow
 {
 	struct promotenode *snap;
 
-	if (!list_link_active(&l->list_head))
+	if (!l || !list_link_active(&l->list_head))
 		return;
 
 	while ((snap = list_tail(l)) != NULL) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 5 dfilter service freebsd_committer freebsd_triage 2010-05-11 10:26:58 UTC
Author: mm
Date: Tue May 11 09:26:46 2010
New Revision: 207911
URL: http://svn.freebsd.org/changeset/base/207911

Log:
  Fix failed assertion on destroying datasets from an older pool version.
  
  OpenSolaris onnv revision:	9390:887948510f80
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6826861)
  MFC after:	3 days

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 09:23:46 2010	(r207910)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue May 11 09:26:46 2010	(r207911)
@@ -1268,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo
 		(void) zio_wait(zio);
 	}
 
-	ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) ||
-	    ds->ds_phys->ds_unique_bytes == 0);
+	ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0);
 
 	if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) {
 		/* Change our contents to that of the prev snapshot */
@@ -1661,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi
 		err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
 		    ADVANCE_POST, kill_blkptr, &ka);
 		ASSERT3U(err, ==, 0);
-		ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE ||
+		ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
 		    ds->ds_phys->ds_unique_bytes == 0);
 	}
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 6 Martin Matuska freebsd_committer freebsd_triage 2010-05-11 10:27:17 UTC
Responsible Changed
From-To: freebsd-fs->mm

This is my PR.
Comment 7 Martin Matuska freebsd_committer freebsd_triage 2010-05-11 10:27:22 UTC
State Changed
From-To: open->patched

Waiting for MFC.
Comment 8 dfilter service freebsd_committer freebsd_triage 2010-05-14 10:50:39 UTC
Author: mm
Date: Fri May 14 09:50:28 2010
New Revision: 208066
URL: http://svn.freebsd.org/changeset/base/208066

Log:
  MFC r207909, r207910, r207911:
  
  MFC r207909:
  Fix zfs rename (may occasionally fail with dataset busy).
  OpenSolaris onnv revision:	8517:41a0783dde17
  
  MFC r207910:
  Fix possible panic with zfs destroy.
  OpenSolaris onnv revision:	8779:f164e0e90508
  
  MFC r207911:
  Fix failed assertion on destroying datasets from an older pool version.
  OpenSolaris onnv revision:	9390:887948510f80
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784757, 6784924, 6826861)

Modified:
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri May 14 09:09:08 2010	(r208065)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri May 14 09:50:28 2010	(r208066)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint
 		return (err);
 	if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) {
 		dsl_dataset_rele(*dsp, owner);
+		*dsp = NULL;
 		return (EBUSY);
 	}
 	return (0);
@@ -1267,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo
 		(void) zio_wait(zio);
 	}
 
-	ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) ||
-	    ds->ds_phys->ds_unique_bytes == 0);
+	ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0);
 
 	if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) {
 		/* Change our contents to that of the prev snapshot */
@@ -1660,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi
 		err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
 		    ADVANCE_POST, kill_blkptr, &ka);
 		ASSERT3U(err, ==, 0);
-		ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE ||
+		ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
 		    ds->ds_phys->ds_unique_bytes == 0);
 	}
 
@@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const 
 	err = dsl_dir_open(oldname, FTAG, &dd, &tail);
 	if (err)
 		return (err);
+	/*
+	 * If there are more than 2 references there may be holds
+	 * hanging around that haven't been cleared out yet.
+	 */
+	if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+		txg_wait_synced(dd->dd_pool, 0);
 	if (tail == NULL) {
 		int delta = strlen(newname) - strlen(oldname);
 
@@ -2578,7 +2584,7 @@ snaplist_destroy(list_t *l, boolean_t ow
 {
 	struct promotenode *snap;
 
-	if (!list_link_active(&l->list_head))
+	if (!l || !list_link_active(&l->list_head))
 		return;
 
 	while ((snap = list_tail(l)) != NULL) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 9 dfilter service freebsd_committer freebsd_triage 2010-05-14 10:57:22 UTC
Author: mm
Date: Fri May 14 09:57:10 2010
New Revision: 208067
URL: http://svn.freebsd.org/changeset/base/208067

Log:
  MFC r207910:
  (cddl/contrib/opensolaris part)
  
  Fix possible panic with zfs destroy.
  OpenSolaris onnv revision:	8779:f164e0e90508
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784924)

Modified:
  stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c
Directory Properties:
  stable/8/cddl/contrib/opensolaris/   (props changed)
  stable/8/cddl/contrib/opensolaris/cmd/zdb/   (props changed)
  stable/8/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  stable/8/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Fri May 14 09:50:28 2010	(r208066)
+++ stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Fri May 14 09:57:10 2010	(r208067)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -93,6 +93,7 @@
 #include <sys/vdev_file.h>
 #include <sys/spa_impl.h>
 #include <sys/dsl_prop.h>
+#include <sys/dsl_dataset.h>
 #include <sys/refcount.h>
 #include <stdio.h>
 #include <stdio_ext.h>
@@ -174,6 +175,7 @@ ztest_func_t ztest_traverse;
 ztest_func_t ztest_dsl_prop_get_set;
 ztest_func_t ztest_dmu_objset_create_destroy;
 ztest_func_t ztest_dmu_snapshot_create_destroy;
+ztest_func_t ztest_dsl_dataset_promote_busy;
 ztest_func_t ztest_spa_create_destroy;
 ztest_func_t ztest_fault_inject;
 ztest_func_t ztest_spa_rename;
@@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = {
 	{ ztest_dsl_prop_get_set,		1,	&zopt_sometimes	},
 	{ ztest_dmu_objset_create_destroy,	1,	&zopt_sometimes },
 	{ ztest_dmu_snapshot_create_destroy,	1,	&zopt_sometimes },
+	{ ztest_dsl_dataset_promote_busy,	1,	&zopt_sometimes },
 	{ ztest_spa_create_destroy,		1,	&zopt_sometimes },
 	{ ztest_fault_inject,			1,	&zopt_sometimes	},
 	{ ztest_spa_rename,			1,	&zopt_rarely	},
@@ -1591,6 +1594,109 @@ ztest_traverse(ztest_args_t *za)
 }
 
 /*
+ * Verify dsl_dataset_promote handles EBUSY
+ */
+void
+ztest_dsl_dataset_promote_busy(ztest_args_t *za)
+{
+	int error;
+	objset_t *os = za->za_os;
+	objset_t *clone;
+	dsl_dataset_t *ds;
+	char snap1name[100];
+	char clone1name[100];
+	char snap2name[100];
+	char clone2name[100];
+	char snap3name[100];
+	char osname[MAXNAMELEN];
+	static uint64_t uniq = 0;
+	uint64_t curval;
+
+	curval = atomic_add_64_nv(&uniq, 5) - 5;
+
+	(void) rw_rdlock(&ztest_shared->zs_name_lock);
+
+	dmu_objset_name(os, osname);
+	(void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++);
+	(void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++);
+	(void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++);
+	(void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++);
+	(void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++);
+
+	error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap1name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error);
+
+	error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone1name, error);
+	dmu_objset_close(clone);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap3name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
+
+	error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone2name, error);
+	dmu_objset_close(clone);
+
+	error = dsl_dataset_own(snap1name, 0, FTAG, &ds);
+	if (error)
+		fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error);
+	error = dsl_dataset_promote(clone2name);
+	if (error != EBUSY)
+		fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
+		    error);
+	dsl_dataset_disown(ds, FTAG);
+
+	error = dmu_objset_destroy(clone2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error);
+
+	error = dmu_objset_destroy(snap3name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(snap2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(clone1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error);
+	error = dmu_objset_destroy(snap1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error);
+
+	(void) rw_unlock(&ztest_shared->zs_name_lock);
+}
+
+/*
  * Verify that dmu_object_{alloc,free} work as expected.
  */
 void
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 10 dfilter service freebsd_committer freebsd_triage 2010-05-14 11:04:24 UTC
Author: mm
Date: Fri May 14 10:04:11 2010
New Revision: 208068
URL: http://svn.freebsd.org/changeset/base/208068

Log:
  MFC r207909, r207910, r207911:
  
  MFC r207909:
  Fix zfs rename (may occasionally fail with dataset busy).
  OpenSolaris onnv revision:	8517:41a0783dde17
  
  MFC r207910:
  Fix possible panic with zfs destroy.
  OpenSolaris onnv revision:	8779:f164e0e90508
  
  MFC r207911:
  Fix failed assertion on destroying datasets from an older pool version.
  OpenSolaris onnv revision:	9390:887948510f80
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784757, 6784924, 6826861)

Modified:
  stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri May 14 09:57:10 2010	(r208067)
+++ stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri May 14 10:04:11 2010	(r208068)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint
 		return (err);
 	if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) {
 		dsl_dataset_rele(*dsp, owner);
+		*dsp = NULL;
 		return (EBUSY);
 	}
 	return (0);
@@ -1267,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo
 		(void) zio_wait(zio);
 	}
 
-	ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) ||
-	    ds->ds_phys->ds_unique_bytes == 0);
+	ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0);
 
 	if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) {
 		/* Change our contents to that of the prev snapshot */
@@ -1660,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi
 		err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
 		    ADVANCE_POST, kill_blkptr, &ka);
 		ASSERT3U(err, ==, 0);
-		ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE ||
+		ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
 		    ds->ds_phys->ds_unique_bytes == 0);
 	}
 
@@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const 
 	err = dsl_dir_open(oldname, FTAG, &dd, &tail);
 	if (err)
 		return (err);
+	/*
+	 * If there are more than 2 references there may be holds
+	 * hanging around that haven't been cleared out yet.
+	 */
+	if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+		txg_wait_synced(dd->dd_pool, 0);
 	if (tail == NULL) {
 		int delta = strlen(newname) - strlen(oldname);
 
@@ -2578,7 +2584,7 @@ snaplist_destroy(list_t *l, boolean_t ow
 {
 	struct promotenode *snap;
 
-	if (!list_link_active(&l->list_head))
+	if (!l || !list_link_active(&l->list_head))
 		return;
 
 	while ((snap = list_tail(l)) != NULL) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 11 dfilter service freebsd_committer freebsd_triage 2010-05-14 11:06:34 UTC
Author: mm
Date: Fri May 14 10:06:20 2010
New Revision: 208069
URL: http://svn.freebsd.org/changeset/base/208069

Log:
  MFC r207910:
  (cddl/contrib/opensolaris part)
  
  Fix possible panic with zfs destroy.
  OpenSolaris onnv revision:	8779:f164e0e90508
  
  PR:		kern/146471
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6784924)

Modified:
  stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c
Directory Properties:
  stable/7/cddl/contrib/opensolaris/   (props changed)

Modified: stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c
==============================================================================
--- stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Fri May 14 10:04:11 2010	(r208068)
+++ stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c	Fri May 14 10:06:20 2010	(r208069)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -93,6 +93,7 @@
 #include <sys/vdev_file.h>
 #include <sys/spa_impl.h>
 #include <sys/dsl_prop.h>
+#include <sys/dsl_dataset.h>
 #include <sys/refcount.h>
 #include <stdio.h>
 #include <stdio_ext.h>
@@ -174,6 +175,7 @@ ztest_func_t ztest_traverse;
 ztest_func_t ztest_dsl_prop_get_set;
 ztest_func_t ztest_dmu_objset_create_destroy;
 ztest_func_t ztest_dmu_snapshot_create_destroy;
+ztest_func_t ztest_dsl_dataset_promote_busy;
 ztest_func_t ztest_spa_create_destroy;
 ztest_func_t ztest_fault_inject;
 ztest_func_t ztest_spa_rename;
@@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = {
 	{ ztest_dsl_prop_get_set,		1,	&zopt_sometimes	},
 	{ ztest_dmu_objset_create_destroy,	1,	&zopt_sometimes },
 	{ ztest_dmu_snapshot_create_destroy,	1,	&zopt_sometimes },
+	{ ztest_dsl_dataset_promote_busy,	1,	&zopt_sometimes },
 	{ ztest_spa_create_destroy,		1,	&zopt_sometimes },
 	{ ztest_fault_inject,			1,	&zopt_sometimes	},
 	{ ztest_spa_rename,			1,	&zopt_rarely	},
@@ -1592,6 +1595,109 @@ ztest_traverse(ztest_args_t *za)
 }
 
 /*
+ * Verify dsl_dataset_promote handles EBUSY
+ */
+void
+ztest_dsl_dataset_promote_busy(ztest_args_t *za)
+{
+	int error;
+	objset_t *os = za->za_os;
+	objset_t *clone;
+	dsl_dataset_t *ds;
+	char snap1name[100];
+	char clone1name[100];
+	char snap2name[100];
+	char clone2name[100];
+	char snap3name[100];
+	char osname[MAXNAMELEN];
+	static uint64_t uniq = 0;
+	uint64_t curval;
+
+	curval = atomic_add_64_nv(&uniq, 5) - 5;
+
+	(void) rw_rdlock(&ztest_shared->zs_name_lock);
+
+	dmu_objset_name(os, osname);
+	(void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++);
+	(void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++);
+	(void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++);
+	(void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++);
+	(void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++);
+
+	error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap1name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error);
+
+	error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone1name, error);
+	dmu_objset_close(clone);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
+	    FALSE);
+	if (error == ENOSPC)
+		ztest_record_enospc("dmu_take_snapshot");
+	else if (error != 0 && error != EEXIST)
+		fatal(0, "dmu_take_snapshot = %d", error);
+
+	error = dmu_objset_open(snap3name, DMU_OST_OTHER,
+	    DS_MODE_USER | DS_MODE_READONLY, &clone);
+	if (error)
+		fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error);
+
+	error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0,
+	    NULL, NULL);
+	if (error)
+		fatal(0, "dmu_objset_create(%s) = %d", clone2name, error);
+	dmu_objset_close(clone);
+
+	error = dsl_dataset_own(snap1name, 0, FTAG, &ds);
+	if (error)
+		fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error);
+	error = dsl_dataset_promote(clone2name);
+	if (error != EBUSY)
+		fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
+		    error);
+	dsl_dataset_disown(ds, FTAG);
+
+	error = dmu_objset_destroy(clone2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error);
+
+	error = dmu_objset_destroy(snap3name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(snap2name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error);
+
+	error = dmu_objset_destroy(clone1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error);
+	error = dmu_objset_destroy(snap1name);
+	if (error)
+		fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error);
+
+	(void) rw_unlock(&ztest_shared->zs_name_lock);
+}
+
+/*
  * Verify that dmu_object_{alloc,free} work as expected.
  */
 void
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 12 Martin Matuska freebsd_committer freebsd_triage 2010-05-14 12:42:08 UTC
State Changed
From-To: patched->closed

Committed. Thanks!