--- a/usr/src/lib/libzfs/common/libzfs_sendrecv.c Wed Feb 20 10:14:25 2008 -0800
+++ b/usr/src/lib/libzfs/common/libzfs_sendrecv.c Wed Feb 20 11:04:28 2008 -0800
@@ -855,22 +855,19 @@
static int seq;
zfs_cmd_t zc = { 0 };
int err;
- prop_changelist_t *clp = NULL;
+ prop_changelist_t *clp;
+ zfs_handle_t *zhp;
- if (strchr(name, '@') == NULL) {
- zfs_handle_t *zhp = zfs_open(hdl, name,
- ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME);
- if (zhp == NULL)
- return (-1);
- clp = changelist_gather(zhp, ZFS_PROP_NAME,
- flags.force ? MS_FORCE : 0);
- zfs_close(zhp);
- if (clp == NULL)
- return (-1);
- err = changelist_prefix(clp);
- if (err)
- return (err);
- }
+ zhp = zfs_open(hdl, name, ZFS_TYPE_DATASET);
+ if (zhp == NULL)
+ return (-1);
+ clp = changelist_gather(zhp, ZFS_PROP_NAME, flags.force ? MS_FORCE : 0);
+ zfs_close(zhp);
+ if (clp == NULL)
+ return (-1);
+ err = changelist_prefix(clp);
+ if (err)
+ return (err);
if (tryname) {
(void) strcpy(newname, tryname);
@@ -884,7 +881,7 @@
zc.zc_name, zc.zc_value);
}
err = ioctl(hdl->libzfs_fd, ZFS_IOC_RENAME, &zc);
- if (err == 0 && clp)
+ if (err == 0)
changelist_rename(clp, name, tryname);
} else {
err = ENOENT;
@@ -903,7 +900,7 @@
zc.zc_name, zc.zc_value);
}
err = ioctl(hdl->libzfs_fd, ZFS_IOC_RENAME, &zc);
- if (err == 0 && clp)
+ if (err == 0)
changelist_rename(clp, name, newname);
if (err && flags.verbose) {
(void) printf("failed (%u) - "
@@ -917,11 +914,8 @@
(void) printf("failed (%u)\n", errno);
}
- if (clp) {
- (void) changelist_postfix(clp);
- changelist_free(clp);
- }
-
+ (void) changelist_postfix(clp);
+ changelist_free(clp);
return (err);
}
@@ -931,42 +925,39 @@
char *newname, recvflags_t flags)
{
zfs_cmd_t zc = { 0 };
- int err;
- zfs_handle_t *zhp = NULL;
+ int err = 0;
+ prop_changelist_t *clp;
+ zfs_handle_t *zhp;
+
+ zhp = zfs_open(hdl, name, ZFS_TYPE_DATASET);
+ if (zhp == NULL)
+ return (-1);
+ clp = changelist_gather(zhp, ZFS_PROP_NAME, flags.force ? MS_FORCE : 0);
+ zfs_close(zhp);
+ if (clp == NULL)
+ return (-1);
+ err = changelist_prefix(clp);
+ if (err)
+ return (err);
zc.zc_objset_type = DMU_OST_ZFS;
(void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name));
- /* unmount it */
- if (strchr(name, '@') == NULL) {
- zhp = zfs_open(hdl, name,
- ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME);
- if (zhp == NULL)
- return (-1);
- err = zfs_unmount(zhp, NULL, flags.force ? MS_FORCE : 0);
- if (err) {
- zfs_close(zhp);
- return (err);
- }
- }
-
if (flags.verbose)
(void) printf("attempting destroy %s\n", zc.zc_name);
err = ioctl(hdl->libzfs_fd, ZFS_IOC_DESTROY, &zc);
- if (err != 0) {
- (void) zfs_mount(zhp, NULL, 0);
- err = recv_rename(hdl, name, NULL, baselen, newname, flags);
+ if (err == 0) {
+ if (flags.verbose)
+ (void) printf("success\n");
+ changelist_remove(clp, zc.zc_name);
}
- if (zhp)
- zfs_close(zhp);
- if (flags.verbose) {
- if (err == 0)
- (void) printf("success\n");
- else
- (void) printf("failed (%u)\n", errno);
- }
+ (void) changelist_postfix(clp);
+ changelist_free(clp);
+
+ if (err != 0)
+ err = recv_rename(hdl, name, NULL, baselen, newname, flags);
return (err);
}