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);