From mm@mail.vx.sk  Mon May 10 15:41:34 2010
Return-Path: <mm@mail.vx.sk>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 6A1711065675;
	Mon, 10 May 2010 15:41:34 +0000 (UTC)
	(envelope-from mm@mail.vx.sk)
Received: from mail.vx.sk (core.vx.sk [188.40.32.143])
	by mx1.freebsd.org (Postfix) with ESMTP id 9ECE48FC14;
	Mon, 10 May 2010 15:41:33 +0000 (UTC)
Received: from core.vx.sk (localhost [127.0.0.1])
	by mail.vx.sk (Postfix) with ESMTP id 952EB9BFE6;
	Mon, 10 May 2010 17:41:32 +0200 (CEST)
Received: from mail.vx.sk ([127.0.0.1])
	by core.vx.sk (mail.vx.sk [127.0.0.1]) (amavisd-new, port 10024)
	with LMTP id AWZyvm6gNZjh; Mon, 10 May 2010 17:41:30 +0200 (CEST)
Received: by mail.vx.sk (Postfix, from userid 1001)
	id 6540A9BFE1; Mon, 10 May 2010 17:41:30 +0200 (CEST)
Message-Id: <20100510154130.6540A9BFE1@mail.vx.sk>
Date: Mon, 10 May 2010 17:41:30 +0200 (CEST)
From: Martin Matuska <mm@FreeBSD.org>
Reply-To: Martin Matuska <mm@FreeBSD.org>
To: FreeBSD-gnats-submit@freebsd.org
Cc: pjd@FreeBSD.org
Subject: [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         146471
>Category:       kern
>Synopsis:       [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    mm
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon May 10 15:50:01 UTC 2010
>Closed-Date:    Fri May 14 11:42:09 UTC 2010
>Last-Modified:  Fri May 14 18:44:15 UTC 2010
>Originator:     Martin Matuska
>Release:        FreeBSD 9-CURRENT amd64
>Organization:
>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.

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);
 	}
 
>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-fs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon May 10 16:16:38 UTC 2010 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146471 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Tue, 11 May 2010 09:19:55 +0000 (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"
 
Responsible-Changed-From-To: freebsd-fs->mm 
Responsible-Changed-By: mm 
Responsible-Changed-When: Tue May 11 09:27:17 UTC 2010 
Responsible-Changed-Why:  
This is my PR. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146471 
State-Changed-From-To: open->patched 
State-Changed-By: mm 
State-Changed-When: Tue May 11 09:27:22 UTC 2010 
State-Changed-Why:  
Waiting for MFC. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146471 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Tue, 11 May 2010 09:24:01 +0000 (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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Tue, 11 May 2010 09:26:58 +0000 (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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Fri, 14 May 2010 09:50:39 +0000 (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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Fri, 14 May 2010 09:57:22 +0000 (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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Fri, 14 May 2010 10:04:24 +0000 (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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/146471: commit references a PR
Date: Fri, 14 May 2010 10:06:34 +0000 (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"

Date: Tue, 11 May 2010 09:48:05 +0200
From: Pawel Jakub Dawidek <pjd@FreeBSD.org>
To: Martin Matuska <mm@FreeBSD.org>
Subject: Re: [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861)

 --5mCyUwZo2JvN/JJP
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 
 On Mon, May 10, 2010 at 05:41:30PM +0200, Martin Matuska wrote:
 >=20
 > >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
 >=20
 > OpenSolaris revision 8517:41a0783dde17
 > 6784757  zfs rename occasionally fails with ebusy
 >=20
 > OpenSolaris revision 8779:f164e0e90508
 > 6784924  panic while ludelete (zfs destroy)
 >=20
 > OpenSolaris revision 9390:887948510f80
 > 6826861  assertion failed in dsl_dataset_destroy_sync when "zfs destroy" =
 old fs
 >=20
 > Patch applies cleanly.
 
 Looks good, go ahead.
 
 > References:
 > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=3D6784757
 > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=3D6784924
 > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=3D6826861
 >=20
 > >How-To-Repeat:
 > >Fix:
 > Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revisio=
 n 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.
 >   */
 > =20
 > @@ -2205,6 +2205,12 @@
 >  	err =3D 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 =3D=3D NULL) {
 >  		int delta =3D strlen(newname) - strlen(oldname);
 > =20
 > Index: cddl/contrib/opensolaris/cmd/ztest/ztest.c
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > --- 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.
 >   */
 > =20
 > @@ -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 @@
 >  }
 > =20
 >  /*
 > + * Verify dsl_dataset_promote handles EBUSY
 > + */
 > +void
 > +ztest_dsl_dataset_promote_busy(ztest_args_t *za)
 > +{
 > +	int error;
 > +	objset_t *os =3D 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 =3D 0;
 > +	uint64_t curval;
 > +
 > +	curval =3D 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 =3D dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE);
 > +	if (error =3D=3D ENOSPC)
 > +		ztest_record_enospc("dmu_take_snapshot");
 > +	else if (error !=3D 0 && error !=3D EEXIST)
 > +		fatal(0, "dmu_take_snapshot =3D %d", error);
 > +
 > +	error =3D dmu_objset_open(snap1name, DMU_OST_OTHER,
 > +	    DS_MODE_USER | DS_MODE_READONLY, &clone);
 > +	if (error)
 > +		fatal(0, "dmu_open_snapshot(%s) =3D %d", snap1name, error);
 > +
 > +	error =3D dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0,
 > +	    NULL, NULL);
 > +	if (error)
 > +		fatal(0, "dmu_objset_create(%s) =3D %d", clone1name, error);
 > +	dmu_objset_close(clone);
 > +
 > +	error =3D dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1,
 > +	    FALSE);
 > +	if (error =3D=3D ENOSPC)
 > +		ztest_record_enospc("dmu_take_snapshot");
 > +	else if (error !=3D 0 && error !=3D EEXIST)
 > +		fatal(0, "dmu_take_snapshot =3D %d", error);
 > +
 > +	error =3D dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1,
 > +	    FALSE);
 > +	if (error =3D=3D ENOSPC)
 > +		ztest_record_enospc("dmu_take_snapshot");
 > +	else if (error !=3D 0 && error !=3D EEXIST)
 > +		fatal(0, "dmu_take_snapshot =3D %d", error);
 > +
 > +	error =3D dmu_objset_open(snap3name, DMU_OST_OTHER,
 > +	    DS_MODE_USER | DS_MODE_READONLY, &clone);
 > +	if (error)
 > +		fatal(0, "dmu_open_snapshot(%s) =3D %d", snap3name, error);
 > +
 > +	error =3D dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0,
 > +	    NULL, NULL);
 > +	if (error)
 > +		fatal(0, "dmu_objset_create(%s) =3D %d", clone2name, error);
 > +	dmu_objset_close(clone);
 > +
 > +	error =3D dsl_dataset_own(snap1name, 0, FTAG, &ds);
 > +	if (error)
 > +		fatal(0, "dsl_dataset_own(%s) =3D %d", snap1name, error);
 > +	error =3D dsl_dataset_promote(clone2name);
 > +	if (error !=3D EBUSY)
 > +		fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
 > +		    error);
 > +	dsl_dataset_disown(ds, FTAG);
 > +
 > +	error =3D dmu_objset_destroy(clone2name);
 > +	if (error)
 > +		fatal(0, "dmu_objset_destroy(%s) =3D %d", clone2name, error);
 > +
 > +	error =3D dmu_objset_destroy(snap3name);
 > +	if (error)
 > +		fatal(0, "dmu_objset_destroy(%s) =3D %d", snap2name, error);
 > +
 > +	error =3D dmu_objset_destroy(snap2name);
 > +	if (error)
 > +		fatal(0, "dmu_objset_destroy(%s) =3D %d", snap2name, error);
 > +
 > +	error =3D dmu_objset_destroy(clone1name);
 > +	if (error)
 > +		fatal(0, "dmu_objset_destroy(%s) =3D %d", clone1name, error);
 > +	error =3D dmu_objset_destroy(snap1name);
 > +	if (error)
 > +		fatal(0, "dmu_objset_destroy(%s) =3D %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
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revisio=
 n 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 =3D NULL;
 >  		return (EBUSY);
 >  	}
 >  	return (0);
 > @@ -2578,7 +2579,7 @@
 >  {
 >  	struct promotenode *snap;
 > =20
 > -	if (!list_link_active(&l->list_head))
 > +	if (!l || !list_link_active(&l->list_head))
 >  		return;
 > =20
 >  	while ((snap =3D list_tail(l)) !=3D NULL) {
 > Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(revisio=
 n 207846)
 > +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	(working=
  copy)
 > @@ -1267,8 +1267,7 @@
 >  		(void) zio_wait(zio);
 >  	}
 > =20
 > -	ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) ||
 > -	    ds->ds_phys->ds_unique_bytes =3D=3D 0);
 > +	ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes =3D=
 =3D 0);
 > =20
 >  	if (ds->ds_prev && ds->ds_prev !=3D ds->ds_dir->dd_pool->dp_origin_snap=
 ) {
 >  		/* Change our contents to that of the prev snapshot */
 > @@ -1660,7 +1659,7 @@
 >  		err =3D traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
 >  		    ADVANCE_POST, kill_blkptr, &ka);
 >  		ASSERT3U(err, =3D=3D, 0);
 > -		ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE ||
 > +		ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
 >  		    ds->ds_phys->ds_unique_bytes =3D=3D 0);
 >  	}
 
 --=20
 Pawel Jakub Dawidek                       http://www.wheelsystems.com
 pjd@FreeBSD.org                           http://www.FreeBSD.org
 FreeBSD committer                         Am I Evil? Yes, I Am!
 
 --5mCyUwZo2JvN/JJP
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.14 (FreeBSD)
 
 iEYEARECAAYFAkvpC7QACgkQForvXbEpPzRDaACdFhozBdBAYBOLuk9cE8yM6x9I
 eJMAn3h4UeRjJoYq7DFBeTDxu17tzF70
 =dtJ/
 -----END PGP SIGNATURE-----
 
 --5mCyUwZo2JvN/JJP--
 
State-Changed-From-To: patched->closed 
State-Changed-By: mm 
State-Changed-When: Fri May 14 11:42:08 UTC 2010 
State-Changed-Why:  
Committed. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146471 
>Unformatted:
