Print this page
Code review fixes
        
@@ -2912,44 +2912,35 @@
         boolean_t stream_wantsnewfs;
         uint64_t parent_snapguid = 0;
         prop_changelist_t *clp = NULL;
         nvlist_t *snapprops_nvlist = NULL;
         zprop_errflags_t prop_errflags;
+        char *snapname = NULL;
 
         begin_time = time(NULL);
 
         (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
             "cannot receive"));
 
         if (stream_avl != NULL) {
-                char *snapname;
                 nvlist_t *fs = fsavl_find(stream_avl, drrb->drr_toguid,
                     &snapname);
                 nvlist_t *props;
                 int ret;
-                boolean_t is_finalsnap;
 
-                VERIFY(fs != NULL);
                 (void) nvlist_lookup_uint64(fs, "parentfromsnap",
                     &parent_snapguid);
-                /*
-                 * Can safely use strcmp because at least "snapname" has been
-                 * verified.
-                 */
-                is_finalsnap = (strcmp(snapname, finalsnap) == 0);
-
-                if (is_finalsnap)
                         err = nvlist_lookup_nvlist(fs, "props", &props);
-                if (!is_finalsnap || err)
+                if (err)
                         VERIFY(0 == nvlist_alloc(&props, NV_UNIQUE_NAME, 0));
 
                 if (flags->canmountoff) {
                         VERIFY(0 == nvlist_add_uint64(props,
                             zfs_prop_to_name(ZFS_PROP_CANMOUNT), 0));
                 }
                 ret = zcmd_write_src_nvlist(hdl, &zc, props);
-                if (!is_finalsnap || err)
+                if (err)
                         nvlist_free(props);
 
                 if (0 == nvlist_lookup_nvlist(fs, "snapprops", &props)) {
                         VERIFY(0 == nvlist_lookup_nvlist(props,
                             snapname, &snapprops_nvlist));
@@ -3275,11 +3266,25 @@
                         (void) nvpair_value_int32(prop_err, &intval);
                         if (strcmp(nvpair_name(prop_err),
                             ZPROP_N_MORE_ERRORS) == 0) {
                                 trunc_prop_errs(intval);
                                 break;
-                        } else {
+                        } else if (snapname == NULL || finalsnap == NULL ||
+                            strcmp(finalsnap, snapname) == 0 ||
+                            strcmp(nvpair_name(prop_err),
+                            zfs_prop_to_name(ZFS_PROP_REFQUOTA)) != 0) {
+                                /*
+                                 * Skip the special case of, for example,
+                                 * "refquota", errors on intermediate
+                                 * snapshots leading up to a final one.
+                                 * That's why we have all of the checks above.
+                                 *
+                                 * See zfs_ioctl.c's extract_delay_props() for
+                                 * a list of props which can fail on
+                                 * intermediate snapshots, but shouldn't
+                                 * affect the overall receive.
+                                 */
                                 (void) snprintf(tbuf, sizeof (tbuf),
                                     dgettext(TEXT_DOMAIN,
                                     "cannot receive %s property on %s"),
                                     nvpair_name(prop_err), zc.zc_name);
                                 zfs_setprop_error(hdl, prop, intval, tbuf);