usr/src/uts/common/fs/zfs/dsl_dir.c
changeset 11823 c756cd80d532
parent 11022 63ab26072e41
child 12296 7cf402a7f374
--- a/usr/src/uts/common/fs/zfs/dsl_dir.c	Thu Feb 25 11:56:41 2010 -0800
+++ b/usr/src/uts/common/fs/zfs/dsl_dir.c	Thu Feb 25 14:08:36 2010 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -1251,8 +1251,14 @@
 	int err;
 	uint64_t val;
 
-	/* There should be 2 references: the open and the dirty */
-	if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+	/*
+	 * There should only be one reference, from dmu_objset_rename().
+	 * Fleeting holds are also possible (eg, from "zfs list" getting
+	 * stats), but any that are present in open context will likely
+	 * be gone by syncing context, so only fail from syncing
+	 * context.
+	 */
+	if (dmu_tx_is_syncing(tx) && dmu_buf_refcount(dd->dd_dbuf) > 1)
 		return (EBUSY);
 
 	/* check for existing name */