]> git.proxmox.com Git - zfsonlinux.git/blob - zfs-patches/0035-Fix-zfs-receive-o-when-used-with-e-d.patch
ae9dae4d024917fdb12eadcd9ac8dbaef856b9af
[zfsonlinux.git] / zfs-patches / 0035-Fix-zfs-receive-o-when-used-with-e-d.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: LOLi <loli10K@users.noreply.github.com>
3 Date: Wed, 31 Jan 2018 00:54:33 +0100
4 Subject: [PATCH] Fix 'zfs receive -o' when used with '-e|-d'
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 When used in conjunction with one of '-e' or '-d' zfs receive options
10 none of the properties requested to be set (-o) are actually applied:
11 this is caused by a wrong assumption made about the toplevel dataset
12 in zfs_receive_one().
13
14 Fix this by correctly detecting the toplevel dataset.
15
16 Reviewed-by: Tony Hutter <hutter2@llnl.gov>
17 Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
18 Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
19 Closes #7088
20
21 Requires-spl: refs/pull/679/head
22 (cherry picked from commit 2f62fdd6447b1a765dfea3cc5bf9e35dc0901aff)
23 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
24 ---
25 lib/libzfs/libzfs_sendrecv.c | 5 +--
26 .../zfs_receive/receive-o-x_props_override.ksh | 36 ++++++++++++++++++++++
27 2 files changed, 39 insertions(+), 2 deletions(-)
28
29 diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
30 index db8079fb3..ec190022f 100644
31 --- a/lib/libzfs/libzfs_sendrecv.c
32 +++ b/lib/libzfs/libzfs_sendrecv.c
33 @@ -3252,7 +3252,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
34 nvlist_t *oxprops = NULL; /* override (-o) and exclude (-x) props */
35 nvlist_t *origprops = NULL; /* original props (if destination exists) */
36 zfs_type_t type;
37 - boolean_t toplevel;
38 + boolean_t toplevel = B_FALSE;
39 boolean_t zoned = B_FALSE;
40
41 begin_time = time(NULL);
42 @@ -3586,7 +3586,8 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
43 goto out;
44 }
45
46 - toplevel = chopprefix[0] != '/';
47 + if (top_zfs && *top_zfs == NULL)
48 + toplevel = B_TRUE;
49 if (drrb->drr_type == DMU_OST_ZVOL) {
50 type = ZFS_TYPE_VOLUME;
51 } else if (drrb->drr_type == DMU_OST_ZFS) {
52 diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
53 index 7137fe278..e4e69851f 100755
54 --- a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
55 +++ b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
56 @@ -371,6 +371,42 @@ log_must eval "check_prop_source $dest type filesystem -"
57 log_must eval "check_prop_source $dest atime off local"
58 log_must eval "check_prop_source $destsub type volume -"
59 log_must eval "check_prop_source $destsub atime - -"
60 +# Cleanup
61 +log_must zfs destroy -r -f $orig
62 +log_must zfs destroy -r -f $dest
63 +
64 +#
65 +# 3.8 Verify 'zfs recv -x|-o' works correctly when used in conjunction with -d
66 +# and -e options.
67 +#
68 +log_must zfs create -p $orig/1/2/3/4
69 +log_must eval "zfs set copies=2 $orig"
70 +log_must eval "zfs set atime=on $orig"
71 +log_must eval "zfs set '$userprop:orig'='oldval' $orig"
72 +log_must zfs snapshot -r $orig@snap1
73 +log_must eval "zfs send -R $orig/1/2@snap1 > $streamfile_repl"
74 +# Verify 'zfs recv -e'
75 +log_must zfs create $dest
76 +log_must eval "zfs receive -e -o copies=3 -x atime "\
77 + "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
78 +log_must datasetexists $dest/2/3/4
79 +log_must eval "check_prop_source $dest/2 copies 3 local"
80 +log_must eval "check_prop_inherit $dest/2/3/4 copies $dest/2"
81 +log_must eval "check_prop_source $dest/2/3/4 atime on default"
82 +log_must eval "check_prop_source $dest/2 '$userprop:orig' 'newval' local"
83 +log_must eval "check_prop_inherit $dest/2/3/4 '$userprop:orig' $dest/2"
84 +log_must zfs destroy -r -f $dest
85 +# Verify 'zfs recv -d'
86 +log_must zfs create $dest
87 +typeset fs="$(echo $orig | awk -F'/' '{print $NF}')"
88 +log_must eval "zfs receive -d -o copies=3 -x atime "\
89 + "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
90 +log_must datasetexists $dest/$fs/1/2/3/4
91 +log_must eval "check_prop_source $dest/$fs/1/2 copies 3 local"
92 +log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 copies $dest/$fs/1/2"
93 +log_must eval "check_prop_source $dest/$fs/1/2/3/4 atime on default"
94 +log_must eval "check_prop_source $dest/$fs/1/2 '$userprop:orig' 'newval' local"
95 +log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 '$userprop:orig' $dest/$fs/1/2"
96 # We don't need to cleanup here
97
98 log_pass "ZFS receive property override and exclude options passed."
99 --
100 2.14.2
101