diff options
author | ahrens <none@none> | 2008-02-20 11:04:28 -0800 |
---|---|---|
committer | ahrens <none@none> | 2008-02-20 11:04:28 -0800 |
commit | d8d7720025734ca1adbaa020f5015dc3d586478d (patch) | |
tree | 0028226158f2745a1037e98f96a7a34ad9f453a4 /usr/src/lib/libzfs/common/libzfs_sendrecv.c | |
parent | d6c8399b0a9535720f3b9d42dd06b3c3a85f0699 (diff) | |
download | illumos-gate-d8d7720025734ca1adbaa020f5015dc3d586478d.tar.gz |
6598604 BAD TRAP while set property to multiple filesystems
6635639 recursive mutex_enter in dbuf_read()
6658356 incremental zfs receive -F does not destroy volumes that were deleted on the send side
Diffstat (limited to 'usr/src/lib/libzfs/common/libzfs_sendrecv.c')
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_sendrecv.c | 87 |
1 files changed, 39 insertions, 48 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs_sendrecv.c b/usr/src/lib/libzfs/common/libzfs_sendrecv.c index 487497e3ca..cbeb5284ff 100644 --- a/usr/src/lib/libzfs/common/libzfs_sendrecv.c +++ b/usr/src/lib/libzfs/common/libzfs_sendrecv.c @@ -855,22 +855,19 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname, 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 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname, 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 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname, 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 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname, (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,43 +925,40 @@ recv_destroy(libzfs_handle_t *hdl, const char *name, int baselen, 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 (zhp) - zfs_close(zhp); - - if (flags.verbose) { - if (err == 0) + if (err == 0) { + if (flags.verbose) (void) printf("success\n"); - else - (void) printf("failed (%u)\n", errno); + changelist_remove(clp, zc.zc_name); } + (void) changelist_postfix(clp); + changelist_free(clp); + + if (err != 0) + err = recv_rename(hdl, name, NULL, baselen, newname, flags); + return (err); } |