--- 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);
}