usr/src/uts/common/fs/zfs/dmu_send.c
changeset 6083 23e77aa611b1
parent 5378 111aa1baa84a
child 6479 2fc187a28649
--- a/usr/src/uts/common/fs/zfs/dmu_send.c	Tue Feb 26 07:21:54 2008 -0800
+++ b/usr/src/uts/common/fs/zfs/dmu_send.c	Tue Feb 26 11:31:49 2008 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -467,6 +467,15 @@
 	if (ds->ds_prev->ds_phys->ds_guid != rbsa->fromguid)
 		return (ENODEV);
 
+	/* temporary clone name must not exist */
+	err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset,
+	    ds->ds_dir->dd_phys->dd_child_dir_zapobj,
+	    rbsa->clonelastname, 8, 1, &val);
+	if (err == 0)
+		return (EEXIST);
+	if (err != ENOENT)
+		return (err);
+
 	/* new snapshot name must not exist */
 	err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset,
 	    ds->ds_phys->ds_snapnames_zapobj, rbsa->tosnap, 8, 1, &val);
@@ -963,8 +972,8 @@
 	return (err);
 }
 
-static void
-recv_abort_cleanup(dmu_recv_cookie_t *drc)
+void
+dmu_recv_abort_cleanup(dmu_recv_cookie_t *drc)
 {
 	if (drc->drc_newfs || drc->drc_real_ds != drc->drc_logical_ds) {
 		/*
@@ -1124,7 +1133,7 @@
 		 * leave it in the restoring state.
 		 */
 		txg_wait_synced(drc->drc_real_ds->ds_dir->dd_pool, 0);
-		recv_abort_cleanup(drc);
+		dmu_recv_abort_cleanup(drc);
 	}
 
 	kmem_free(ra.buf, ra.bufsize);
@@ -1182,7 +1191,7 @@
 	    DS_MODE_PRIMARY, DS_MODE_EXCLUSIVE)) {
 		lmode = DS_MODE_EXCLUSIVE;
 	} else {
-		recv_abort_cleanup(drc);
+		dmu_recv_abort_cleanup(drc);
 		return (EBUSY);
 	}