summaryrefslogtreecommitdiff
path: root/usr/src/lib/libzfs/common/libzfs_sendrecv.c
diff options
context:
space:
mode:
authorTom Erickson <Tom.Erickson@Sun.COM>2010-03-22 19:32:07 -0700
committerTom Erickson <Tom.Erickson@Sun.COM>2010-03-22 19:32:07 -0700
commit83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70 (patch)
tree781aae2f88cc8259ef3a05d604029ebbeeebde19 /usr/src/lib/libzfs/common/libzfs_sendrecv.c
parent007a36532dce1d38a2504164c2191710645ba2b9 (diff)
downloadillumos-gate-83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70.tar.gz
6931963 zfs_receive_004_neg test regression results in no reported error for invalid incremental receive
6917437 fmd utilities (fmadm, fmstat) hang on error injection followed by fmd restart
Diffstat (limited to 'usr/src/lib/libzfs/common/libzfs_sendrecv.c')
-rw-r--r--usr/src/lib/libzfs/common/libzfs_sendrecv.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs_sendrecv.c b/usr/src/lib/libzfs/common/libzfs_sendrecv.c
index d36a79daf3..b4f972560e 100644
--- a/usr/src/lib/libzfs/common/libzfs_sendrecv.c
+++ b/usr/src/lib/libzfs/common/libzfs_sendrecv.c
@@ -2426,7 +2426,14 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
(void) strcpy(zc.zc_name, zc.zc_value);
*strchr(zc.zc_name, '@') = '\0';
- if (!zfs_dataset_exists(hdl, zc.zc_name, ZFS_TYPE_DATASET)) {
+ /*
+ * If the exact receive path was specified and this is the
+ * topmost path in the stream, then if the fs does not exist we
+ * should look no further.
+ */
+ if ((flags.isprefix || (*(chopprefix = drrb->drr_toname +
+ strlen(sendfs)) != '\0' && *chopprefix != '@')) &&
+ !zfs_dataset_exists(hdl, zc.zc_name, ZFS_TYPE_DATASET)) {
char snap[ZFS_MAXNAMELEN];
(void) strcpy(snap, strchr(zc.zc_value, '@'));
if (guid_to_name(hdl, tosnap, drrb->drr_fromguid,
@@ -2844,7 +2851,7 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap, recvflags_t flags,
return (zfs_receive_one(hdl, infd, tosnap, flags,
&drr, &drr_noswap, sendfs, stream_nv, stream_avl,
top_zfs));
- } else { /* must be DMU_COMPOUNDSTREAM */
+ } else {
assert(DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo) ==
DMU_COMPOUNDSTREAM);
return (zfs_receive_package(hdl, infd, tosnap, flags,