Fix 'zfs receive -o' when used with '-e|-d'
When used in conjunction with one of '-e' or '-d' zfs receive options none of the properties requested to be set (-o) are actually applied: this is caused by a wrong assumption made about the toplevel dataset in zfs_receive_one(). Fix this by correctly detecting the toplevel dataset. Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: loli10K <ezomori.nozomu@gmail.com> Closes #7088
This commit is contained in:
parent
405ec516ab
commit
bee7e4ff12
|
@ -3603,7 +3603,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||||
nvlist_t *oxprops = NULL; /* override (-o) and exclude (-x) props */
|
nvlist_t *oxprops = NULL; /* override (-o) and exclude (-x) props */
|
||||||
nvlist_t *origprops = NULL; /* original props (if destination exists) */
|
nvlist_t *origprops = NULL; /* original props (if destination exists) */
|
||||||
zfs_type_t type;
|
zfs_type_t type;
|
||||||
boolean_t toplevel;
|
boolean_t toplevel = B_FALSE;
|
||||||
boolean_t zoned = B_FALSE;
|
boolean_t zoned = B_FALSE;
|
||||||
|
|
||||||
begin_time = time(NULL);
|
begin_time = time(NULL);
|
||||||
|
@ -4013,7 +4013,8 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
toplevel = chopprefix[0] != '/';
|
if (top_zfs && *top_zfs == NULL)
|
||||||
|
toplevel = B_TRUE;
|
||||||
if (drrb->drr_type == DMU_OST_ZVOL) {
|
if (drrb->drr_type == DMU_OST_ZVOL) {
|
||||||
type = ZFS_TYPE_VOLUME;
|
type = ZFS_TYPE_VOLUME;
|
||||||
} else if (drrb->drr_type == DMU_OST_ZFS) {
|
} else if (drrb->drr_type == DMU_OST_ZFS) {
|
||||||
|
|
|
@ -371,6 +371,42 @@ log_must eval "check_prop_source $dest type filesystem -"
|
||||||
log_must eval "check_prop_source $dest atime off local"
|
log_must eval "check_prop_source $dest atime off local"
|
||||||
log_must eval "check_prop_source $destsub type volume -"
|
log_must eval "check_prop_source $destsub type volume -"
|
||||||
log_must eval "check_prop_source $destsub atime - -"
|
log_must eval "check_prop_source $destsub atime - -"
|
||||||
|
# Cleanup
|
||||||
|
log_must zfs destroy -r -f $orig
|
||||||
|
log_must zfs destroy -r -f $dest
|
||||||
|
|
||||||
|
#
|
||||||
|
# 3.8 Verify 'zfs recv -x|-o' works correctly when used in conjunction with -d
|
||||||
|
# and -e options.
|
||||||
|
#
|
||||||
|
log_must zfs create -p $orig/1/2/3/4
|
||||||
|
log_must eval "zfs set copies=2 $orig"
|
||||||
|
log_must eval "zfs set atime=on $orig"
|
||||||
|
log_must eval "zfs set '$userprop:orig'='oldval' $orig"
|
||||||
|
log_must zfs snapshot -r $orig@snap1
|
||||||
|
log_must eval "zfs send -R $orig/1/2@snap1 > $streamfile_repl"
|
||||||
|
# Verify 'zfs recv -e'
|
||||||
|
log_must zfs create $dest
|
||||||
|
log_must eval "zfs receive -e -o copies=3 -x atime "\
|
||||||
|
"-o '$userprop:orig'='newval' $dest < $streamfile_repl"
|
||||||
|
log_must datasetexists $dest/2/3/4
|
||||||
|
log_must eval "check_prop_source $dest/2 copies 3 local"
|
||||||
|
log_must eval "check_prop_inherit $dest/2/3/4 copies $dest/2"
|
||||||
|
log_must eval "check_prop_source $dest/2/3/4 atime on default"
|
||||||
|
log_must eval "check_prop_source $dest/2 '$userprop:orig' 'newval' local"
|
||||||
|
log_must eval "check_prop_inherit $dest/2/3/4 '$userprop:orig' $dest/2"
|
||||||
|
log_must zfs destroy -r -f $dest
|
||||||
|
# Verify 'zfs recv -d'
|
||||||
|
log_must zfs create $dest
|
||||||
|
typeset fs="$(echo $orig | awk -F'/' '{print $NF}')"
|
||||||
|
log_must eval "zfs receive -d -o copies=3 -x atime "\
|
||||||
|
"-o '$userprop:orig'='newval' $dest < $streamfile_repl"
|
||||||
|
log_must datasetexists $dest/$fs/1/2/3/4
|
||||||
|
log_must eval "check_prop_source $dest/$fs/1/2 copies 3 local"
|
||||||
|
log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 copies $dest/$fs/1/2"
|
||||||
|
log_must eval "check_prop_source $dest/$fs/1/2/3/4 atime on default"
|
||||||
|
log_must eval "check_prop_source $dest/$fs/1/2 '$userprop:orig' 'newval' local"
|
||||||
|
log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 '$userprop:orig' $dest/$fs/1/2"
|
||||||
# We don't need to cleanup here
|
# We don't need to cleanup here
|
||||||
|
|
||||||
log_pass "ZFS receive property override and exclude options passed."
|
log_pass "ZFS receive property override and exclude options passed."
|
||||||
|
|
Loading…
Reference in New Issue