summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/dmu_send.c
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2015-05-28 12:08:20 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2015-05-28 12:08:20 +0000
commit875d2a359726f3c8cbb1d3aea07d338b78810b56 (patch)
tree78236213079c47c39e4034f67077db22bd4a6bcb /usr/src/uts/common/fs/zfs/dmu_send.c
parente69deeed01db5ab5784bcfe090f788f6bc6f574b (diff)
parent09f79f7c66b85f056db11f58210dc6182c9b1aef (diff)
downloadillumos-joyent-20150528.tar.gz
[illumos-gate merge]20150528release-20150528
commit 09f79f7c66b85f056db11f58210dc6182c9b1aef 4418 svc.startd crash with a long instance name and more than one dependency commit cb5842f8b0caaad0ed53535bd77042e933fdbafe 5909 ensure that shared snap names don't become too long after promotion commit beddaa9ce797b9deaafc22b4f156d23f9b45c32d 5870 dmu_recv_end_check() leaks origin_head hold if error happens in drc_force branch commit 5bae108fe2364722de3aa86e04966a0d33fd027a 5912 full stream can not be force-received into a dataset if it has a snapshot commit c701fde6911c957e71b37aac4daf672bd828f4d7 5961 Fix stack overflow in zfs_create_fs commit c423721f9bcd45c2409ef7b73fc103ac2889f9e9 5669 altroot not set in zpool create when specified with -o commit 5897eb49ccde82d19214b71984f57935e7e313d1 5438 zfs_blkptr_verify should continue after zfs_panic_recover
Diffstat (limited to 'usr/src/uts/common/fs/zfs/dmu_send.c')
-rw-r--r--usr/src/uts/common/fs/zfs/dmu_send.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/usr/src/uts/common/fs/zfs/dmu_send.c b/usr/src/uts/common/fs/zfs/dmu_send.c
index e4abdc3254..2086fe4f0f 100644
--- a/usr/src/uts/common/fs/zfs/dmu_send.c
+++ b/usr/src/uts/common/fs/zfs/dmu_send.c
@@ -1025,10 +1025,12 @@ recv_begin_check_existing_impl(dmu_recv_begin_arg_t *drba, dsl_dataset_t *ds,
dsl_dataset_rele(snap, FTAG);
} else {
- /* if full, most recent snapshot must be $ORIGIN */
- if (dsl_dataset_phys(ds)->ds_prev_snap_txg >= TXG_INITIAL)
- return (SET_ERROR(ENODEV));
- drba->drba_snapobj = dsl_dataset_phys(ds)->ds_prev_snap_obj;
+ /* if full, then must be forced */
+ if (!drba->drba_cookie->drc_force)
+ return (SET_ERROR(EEXIST));
+ /* start from $ORIGIN@$ORIGIN, if supported */
+ drba->drba_snapobj = dp->dp_origin_snap != NULL ?
+ dp->dp_origin_snap->ds_object : 0;
}
return (0);
@@ -2083,7 +2085,7 @@ dmu_recv_end_check(void *arg, dmu_tx_t *tx)
error = dsl_dataset_hold_obj(dp, obj, FTAG,
&snap);
if (error != 0)
- return (error);
+ break;
if (snap->ds_dir != origin_head->ds_dir)
error = SET_ERROR(EINVAL);
if (error == 0) {
@@ -2093,7 +2095,11 @@ dmu_recv_end_check(void *arg, dmu_tx_t *tx)
obj = dsl_dataset_phys(snap)->ds_prev_snap_obj;
dsl_dataset_rele(snap, FTAG);
if (error != 0)
- return (error);
+ break;
+ }
+ if (error != 0) {
+ dsl_dataset_rele(origin_head, FTAG);
+ return (error);
}
}
error = dsl_dataset_clone_swap_check_impl(drc->drc_ds,