]> granicus.if.org Git - zfs/commitdiff
Fix incorrect error message for raw receive
authorTom Caputi <tcaputi@datto.com>
Mon, 10 Jun 2019 16:45:08 +0000 (12:45 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 10 Jun 2019 16:45:08 +0000 (09:45 -0700)
This patch fixes an incorrect error message that comes up when
doing a non-forcing, raw, incremental receive into a dataset
that has a newer snapshot than the "from" snapshot. In this
case, the current code prints a confusing message about an IVset
guid mismatch.

This functionality is supported by non-raw receives as an
undocumented feature, but was never supported by the raw receive
code. If this is desired in the future, we can probably figure
out a way to make it work.

Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Issue #8758
Closes #8863

module/zfs/dmu_recv.c

index 976b1bd464207247172b3e1e3ab4eba2deac7216..65a031b42cc6cb53b50ed3d9519970cb949802e4 100644 (file)
@@ -158,9 +158,16 @@ recv_begin_check_existing_impl(dmu_recv_begin_arg_t *drba, dsl_dataset_t *ds,
                } else {
                        /*
                         * If we are not forcing, there must be no
-                        * changes since fromsnap.
+                        * changes since fromsnap. Raw sends have an
+                        * additional constraint that requires that
+                        * no "noop" snapshots exist between fromsnap
+                        * and tosnap for the IVset checking code to
+                        * work properly.
                         */
-                       if (dsl_dataset_modified_since_snap(ds, snap)) {
+                       if (dsl_dataset_modified_since_snap(ds, snap) ||
+                           (raw &&
+                           dsl_dataset_phys(ds)->ds_prev_snap_obj !=
+                           snap->ds_object)) {
                                dsl_dataset_rele(snap, FTAG);
                                return (SET_ERROR(ETXTBSY));
                        }