diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-05-28 12:08:20 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-05-28 12:08:20 +0000 |
commit | 875d2a359726f3c8cbb1d3aea07d338b78810b56 (patch) | |
tree | 78236213079c47c39e4034f67077db22bd4a6bcb /usr/src/uts/common/fs/zfs/dmu_send.c | |
parent | e69deeed01db5ab5784bcfe090f788f6bc6f574b (diff) | |
parent | 09f79f7c66b85f056db11f58210dc6182c9b1aef (diff) | |
download | illumos-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.c | 18 |
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, |