svn commit: r366180 - stable/12/cddl/contrib/opensolaris/lib/libzfs/common

Alan Somers asomers at FreeBSD.org
Sat Sep 26 02:50:29 UTC 2020


Author: asomers
Date: Sat Sep 26 02:50:28 2020
New Revision: 366180
URL: https://svnweb.freebsd.org/changeset/base/366180

Log:
  zfs: Fix resuming receive stream to dataset with mounted clone
  
  My fix for bug 248606 (zfs receive: Input/output error accessing dataset
  after resuming interrupted receive), r364412, introduced a regression:
  attempting to resume a receive into a dataset with a mounted clone would
  fail if that clone were in-use.  This change reverts r364412 and fixes it in
  a better way.
  
  Background:
  When ZFS receives a stream, it may decide to unmount and remount the
  destination and all of its children.  However, ever since resumable
  send/receive was implemented, ZFS has skipped the unmount/remount step when
  resuming a stream.  I don't know why.
  
  That let to bug 248606.  When resuming the stream, ZFS didn't unmount and
  remount the destination, leaving a destroyed dataset mounted.
  
  My original fix was to always unmount and remount when resuming a receive,
  but that caused other problems, like bug 249579.  A better solution is to
  unmount and remount when resuming a receive of a stream that would've
  unmounted and remounted when it was new.
  
  Direct commit to stable/12 because head has moved to OpenZFS.  The bug
  exists there, too, but a change to the OpenZFS code can't be merged to the
  old ZFS code.
  
  PR:		249579
  Reviewed by:	mmacy
  MFC after:	1 week
  Sponsored by:	Axcient

Modified:
  stable/12/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c

Modified: stable/12/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
==============================================================================
--- stable/12/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Sat Sep 26 00:58:27 2020	(r366179)
+++ stable/12/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Sat Sep 26 02:50:28 2020	(r366180)
@@ -3301,7 +3301,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const 
 	boolean_t resuming = DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo) &
 	    DMU_BACKUP_FEATURE_RESUMING;
 	stream_wantsnewfs = (drrb->drr_fromguid == 0 ||
-	    (drrb->drr_flags & DRR_FLAG_CLONE) || originsnap) && !resuming;
+	    (drrb->drr_flags & DRR_FLAG_CLONE) || originsnap);
 
 	if (stream_wantsnewfs) {
 		/*
@@ -3433,7 +3433,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const 
 		}
 
 		if (!flags->dryrun && zhp->zfs_type == ZFS_TYPE_FILESYSTEM &&
-		    (stream_wantsnewfs || resuming)) {
+		    stream_wantsnewfs) {
 			/* We can't do online recv in this case */
 			clp = changelist_gather(zhp, ZFS_PROP_NAME, 0, 0);
 			if (clp == NULL) {


More information about the svn-src-stable-12 mailing list