]> granicus.if.org Git - zfs/commitdiff
Illumos 5912 - full stream can not be force-received into a dataset if it has a snapshot
authorAndriy Gapon <avg@freebsd.org>
Thu, 2 Jul 2015 13:03:31 +0000 (16:03 +0300)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 6 Jul 2015 16:20:18 +0000 (09:20 -0700)
5912 full stream can not be force-received into a dataset if it has a snapshot
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>

References:
  https://www.illumos.org/issues/5912
  https://github.com/illumos/illumos-gate/commit/5bae108

Ported-by: Andriy Gapon <avg@FreeBSD.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3549

module/zfs/dmu_send.c

index 8fa6797c4cdb7a2981c8fb31701ce10127562462..d900d5cd0e5eb182e2bd6f9ac688d484248bf29e 100644 (file)
@@ -1036,10 +1036,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);