--- 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);