Print this page
Code review fixes

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libzfs/common/libzfs_sendrecv.c
          +++ new/usr/src/lib/libzfs/common/libzfs_sendrecv.c
↓ open down ↓ 2906 lines elided ↑ open up ↑
2907 2907          struct drr_begin *drrb = &drr->drr_u.drr_begin;
2908 2908          char errbuf[1024];
2909 2909          char prop_errbuf[1024];
2910 2910          const char *chopprefix;
2911 2911          boolean_t newfs = B_FALSE;
2912 2912          boolean_t stream_wantsnewfs;
2913 2913          uint64_t parent_snapguid = 0;
2914 2914          prop_changelist_t *clp = NULL;
2915 2915          nvlist_t *snapprops_nvlist = NULL;
2916 2916          zprop_errflags_t prop_errflags;
     2917 +        char *snapname = NULL;
2917 2918  
2918 2919          begin_time = time(NULL);
2919 2920  
2920 2921          (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
2921 2922              "cannot receive"));
2922 2923  
2923 2924          if (stream_avl != NULL) {
2924      -                char *snapname;
2925 2925                  nvlist_t *fs = fsavl_find(stream_avl, drrb->drr_toguid,
2926 2926                      &snapname);
2927 2927                  nvlist_t *props;
2928 2928                  int ret;
2929      -                boolean_t is_finalsnap;
2930 2929  
2931      -                VERIFY(fs != NULL);
2932 2930                  (void) nvlist_lookup_uint64(fs, "parentfromsnap",
2933 2931                      &parent_snapguid);
2934      -                /*
2935      -                 * Can safely use strcmp because at least "snapname" has been
2936      -                 * verified.
2937      -                 */
2938      -                is_finalsnap = (strcmp(snapname, finalsnap) == 0);
2939      -
2940      -                if (is_finalsnap)
2941      -                        err = nvlist_lookup_nvlist(fs, "props", &props);
2942      -                if (!is_finalsnap || err)
     2932 +                err = nvlist_lookup_nvlist(fs, "props", &props);
     2933 +                if (err)
2943 2934                          VERIFY(0 == nvlist_alloc(&props, NV_UNIQUE_NAME, 0));
2944 2935  
2945 2936                  if (flags->canmountoff) {
2946 2937                          VERIFY(0 == nvlist_add_uint64(props,
2947 2938                              zfs_prop_to_name(ZFS_PROP_CANMOUNT), 0));
2948 2939                  }
2949 2940                  ret = zcmd_write_src_nvlist(hdl, &zc, props);
2950      -                if (!is_finalsnap || err)
     2941 +                if (err)
2951 2942                          nvlist_free(props);
2952 2943  
2953 2944                  if (0 == nvlist_lookup_nvlist(fs, "snapprops", &props)) {
2954 2945                          VERIFY(0 == nvlist_lookup_nvlist(props,
2955 2946                              snapname, &snapprops_nvlist));
2956 2947                  }
2957 2948  
2958 2949                  if (ret != 0)
2959 2950                          return (-1);
2960 2951          }
↓ open down ↓ 309 lines elided ↑ open up ↑
3270 3261                          char tbuf[1024];
3271 3262                          zfs_prop_t prop;
3272 3263                          int intval;
3273 3264  
3274 3265                          prop = zfs_name_to_prop(nvpair_name(prop_err));
3275 3266                          (void) nvpair_value_int32(prop_err, &intval);
3276 3267                          if (strcmp(nvpair_name(prop_err),
3277 3268                              ZPROP_N_MORE_ERRORS) == 0) {
3278 3269                                  trunc_prop_errs(intval);
3279 3270                                  break;
3280      -                        } else {
     3271 +                        } else if (snapname == NULL || finalsnap == NULL ||
     3272 +                            strcmp(finalsnap, snapname) == 0 ||
     3273 +                            strcmp(nvpair_name(prop_err),
     3274 +                            zfs_prop_to_name(ZFS_PROP_REFQUOTA)) != 0) {
     3275 +                                /*
     3276 +                                 * Skip the special case of, for example,
     3277 +                                 * "refquota", errors on intermediate
     3278 +                                 * snapshots leading up to a final one.
     3279 +                                 * That's why we have all of the checks above.
     3280 +                                 *
     3281 +                                 * See zfs_ioctl.c's extract_delay_props() for
     3282 +                                 * a list of props which can fail on
     3283 +                                 * intermediate snapshots, but shouldn't
     3284 +                                 * affect the overall receive.
     3285 +                                 */
3281 3286                                  (void) snprintf(tbuf, sizeof (tbuf),
3282 3287                                      dgettext(TEXT_DOMAIN,
3283 3288                                      "cannot receive %s property on %s"),
3284 3289                                      nvpair_name(prop_err), zc.zc_name);
3285 3290                                  zfs_setprop_error(hdl, prop, intval, tbuf);
3286 3291                          }
3287 3292                  }
3288 3293                  nvlist_free(prop_errors);
3289 3294          }
3290 3295  
↓ open down ↓ 342 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX