Print this page
Code review fixes
        
*** 2912,2955 ****
          boolean_t stream_wantsnewfs;
          uint64_t parent_snapguid = 0;
          prop_changelist_t *clp = NULL;
          nvlist_t *snapprops_nvlist = NULL;
          zprop_errflags_t prop_errflags;
  
          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)
                          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)
                          nvlist_free(props);
  
                  if (0 == nvlist_lookup_nvlist(fs, "snapprops", &props)) {
                          VERIFY(0 == nvlist_lookup_nvlist(props,
                              snapname, &snapprops_nvlist));
--- 2912,2946 ----
          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) {
                  nvlist_t *fs = fsavl_find(stream_avl, drrb->drr_toguid,
                      &snapname);
                  nvlist_t *props;
                  int ret;
  
                  (void) nvlist_lookup_uint64(fs, "parentfromsnap",
                      &parent_snapguid);
                  err = nvlist_lookup_nvlist(fs, "props", &props);
!                 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 (err)
                          nvlist_free(props);
  
                  if (0 == nvlist_lookup_nvlist(fs, "snapprops", &props)) {
                          VERIFY(0 == nvlist_lookup_nvlist(props,
                              snapname, &snapprops_nvlist));
*** 3275,3285 ****
                          (void) nvpair_value_int32(prop_err, &intval);
                          if (strcmp(nvpair_name(prop_err),
                              ZPROP_N_MORE_ERRORS) == 0) {
                                  trunc_prop_errs(intval);
                                  break;
!                         } else {
                                  (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);
--- 3266,3290 ----
                          (void) nvpair_value_int32(prop_err, &intval);
                          if (strcmp(nvpair_name(prop_err),
                              ZPROP_N_MORE_ERRORS) == 0) {
                                  trunc_prop_errs(intval);
                                  break;
!                         } 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);