Mercurial > illumos > illumos-gate
changeset 10735:336fb268ea6f
6885860 zfs send shouldn't require support for snapshot holds
author | Chris Kirby <chris.kirby@sun.com> |
---|---|
date | Wed, 07 Oct 2009 16:05:49 -0600 |
parents | 0622a203d039 |
children | d831c82c5d2c |
files | usr/src/lib/libzfs/common/libzfs_sendrecv.c |
diffstat | 1 files changed, 35 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/lib/libzfs/common/libzfs_sendrecv.c Wed Oct 07 14:39:04 2009 -0700 +++ b/usr/src/lib/libzfs/common/libzfs_sendrecv.c Wed Oct 07 16:05:49 2009 -0600 @@ -720,6 +720,8 @@ avl_tree_t *fsavl = NULL; char holdtag[128]; static uint64_t holdseq; + int spa_version; + boolean_t holdsnaps = B_FALSE; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot send '%s'"), zhp->zfs_name); @@ -730,6 +732,10 @@ return (zfs_error(zhp->zfs_hdl, EZFS_NOENT, errbuf)); } + if (zfs_spa_version(zhp, &spa_version) == 0 && + spa_version >= SPA_VERSION_USERREFS) + holdsnaps = B_TRUE; + if (replicate || doall) { dmu_replay_record_t drr = { 0 }; char *packbuf = NULL; @@ -738,12 +744,15 @@ assert(fromsnap || doall); - (void) snprintf(holdtag, sizeof (holdtag), ".send-%d-%llu", - getpid(), (u_longlong_t)holdseq); - ++holdseq; - err = zfs_hold_range(zhp, fromsnap, tosnap, holdtag, B_TRUE); - if (err) - return (err); + if (holdsnaps) { + (void) snprintf(holdtag, sizeof (holdtag), + ".send-%d-%llu", getpid(), (u_longlong_t)holdseq); + ++holdseq; + err = zfs_hold_range(zhp, fromsnap, tosnap, + holdtag, B_TRUE); + if (err) + return (err); + } if (replicate) { nvlist_t *hdrnv; @@ -757,8 +766,10 @@ err = gather_nvlist(zhp->zfs_hdl, zhp->zfs_name, fromsnap, tosnap, &fss, &fsavl); if (err) { - (void) zfs_release_range(zhp, fromsnap, tosnap, - holdtag); + if (holdsnaps) { + (void) zfs_release_range(zhp, fromsnap, + tosnap, holdtag); + } return (err); } VERIFY(0 == nvlist_add_nvlist(hdrnv, "fss", fss)); @@ -768,8 +779,10 @@ if (err) { fsavl_destroy(fsavl); nvlist_free(fss); - (void) zfs_release_range(zhp, fromsnap, tosnap, - holdtag); + if (holdsnaps) { + (void) zfs_release_range(zhp, fromsnap, + tosnap, holdtag); + } return (zfs_standard_error(zhp->zfs_hdl, err, errbuf)); } @@ -795,8 +808,10 @@ if (err == -1) { fsavl_destroy(fsavl); nvlist_free(fss); - (void) zfs_release_range(zhp, fromsnap, tosnap, - holdtag); + if (holdsnaps) { + (void) zfs_release_range(zhp, fromsnap, tosnap, + holdtag); + } return (zfs_standard_error(zhp->zfs_hdl, errno, errbuf)); } @@ -810,8 +825,10 @@ if (err == -1) { fsavl_destroy(fsavl); nvlist_free(fss); - (void) zfs_release_range(zhp, fromsnap, tosnap, - holdtag); + if (holdsnaps) { + (void) zfs_release_range(zhp, fromsnap, + tosnap, holdtag); + } return (zfs_standard_error(zhp->zfs_hdl, errno, errbuf)); } @@ -840,11 +857,14 @@ */ dmu_replay_record_t drr = { 0 }; drr.drr_type = DRR_END; + if (holdsnaps) { + (void) zfs_release_range(zhp, fromsnap, tosnap, + holdtag); + } if (write(outfd, &drr, sizeof (drr)) == -1) { return (zfs_standard_error(zhp->zfs_hdl, errno, errbuf)); } - (void) zfs_release_range(zhp, fromsnap, tosnap, holdtag); } return (err || sdd.err);