]>
Commit | Line | Data |
---|---|---|
a010b409 SI |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: LOLi <loli10K@users.noreply.github.com> | |
3 | Date: Tue, 1 May 2018 05:58:29 +0200 | |
4 | Subject: [PATCH] Fix zfs incremental send remove '-o' properties | |
5 | ||
6 | When receiving an incremental send stream with intermediary snapshots | |
7 | zfs_receive_one() does not correctly identify the top-level dataset: | |
8 | consequently we restore said snapshots as if they were children | |
9 | datasets in the hierarchy, forcing inheritance of any property received | |
10 | with 'zfs send -o' and effectively removing any locally set value. | |
11 | ||
12 | The test case did not correctly verify this situation because it uses | |
13 | adjacent snapshots, basically testing 'zfs send -i' instead of | |
14 | 'zfs send -I': this commit adds an additional intermediary snapshot to | |
15 | the test script. | |
16 | ||
17 | Reviewed-by: Paul Dagnelie <pcd@delphix.com> | |
18 | Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> | |
19 | Signed-off-by: loli10K <ezomori.nozomu@gmail.com> | |
20 | Closes #7478 | |
21 | ||
22 | Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com> | |
23 | --- | |
24 | lib/libzfs/libzfs_sendrecv.c | 2 +- | |
25 | .../zfs_receive/receive-o-x_props_override.ksh | 22 +++++++++++++--------- | |
26 | 2 files changed, 14 insertions(+), 10 deletions(-) | |
27 | ||
28 | diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c | |
29 | index 5490581a..c5acd21a 100644 | |
30 | --- a/lib/libzfs/libzfs_sendrecv.c | |
31 | +++ b/lib/libzfs/libzfs_sendrecv.c | |
32 | @@ -3592,7 +3592,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, | |
33 | goto out; | |
34 | } | |
35 | ||
36 | - if (top_zfs && *top_zfs == NULL) | |
37 | + if (top_zfs && (*top_zfs == NULL || strcmp(*top_zfs, name) == 0)) | |
38 | toplevel = B_TRUE; | |
39 | if (drrb->drr_type == DMU_OST_ZVOL) { | |
40 | type = ZFS_TYPE_VOLUME; | |
41 | 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 | |
42 | index e4e69851..4e3a5393 100755 | |
43 | --- a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh | |
44 | +++ b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh | |
45 | @@ -212,16 +212,17 @@ log_must eval "zfs send -R $orig@snap1 > $streamfile_repl" | |
46 | log_must eval "zfs recv $dest < $streamfile_repl" | |
47 | # Fill the datasets with properties and create an incremental replication stream | |
48 | log_must zfs snapshot -r $orig@snap2 | |
49 | +log_must zfs snapshot -r $orig@snap3 | |
50 | log_must eval "zfs set copies=2 $orig" | |
51 | log_must eval "zfs set '$userprop:orig'='$userval' $orig" | |
52 | log_must eval "zfs set '$userprop:orig'='$userval' $origsub" | |
53 | log_must eval "zfs set '$userprop:snap'='$userval' $orig@snap1" | |
54 | -log_must eval "zfs set '$userprop:snap'='$userval' $origsub@snap2" | |
55 | -log_must eval "zfs send -R -I $orig@snap1 $orig@snap2 > $streamfile_incr" | |
56 | +log_must eval "zfs set '$userprop:snap'='$userval' $origsub@snap3" | |
57 | +log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr" | |
58 | # Sets various combination of override and exclude options | |
59 | log_must eval "zfs recv -F -o atime=off -o '$userprop:dest2'='$userval' "\ | |
60 | "-o quota=123456789 -x compression -x '$userprop:orig' " \ | |
61 | - "-x '$userprop:snap2' $dest < $streamfile_incr" | |
62 | + "-x '$userprop:snap3' $dest < $streamfile_incr" | |
63 | # Verify we can correctly override and exclude properties | |
64 | log_must eval "check_prop_source $dest copies 2 received" | |
65 | log_must eval "check_prop_source $dest atime off local" | |
66 | @@ -237,9 +238,9 @@ log_must eval "check_prop_missing $destsub '$userprop:orig'" | |
67 | log_must eval "check_prop_source " \ | |
68 | "$dest@snap1 '$userprop:snap' '$userval' received" | |
69 | log_must eval "check_prop_source " \ | |
70 | - "$destsub@snap2 '$userprop:snap' '$userval' received" | |
71 | -log_must eval "check_prop_missing $dest@snap2 '$userprop:snap2'" | |
72 | -log_must eval "check_prop_missing $destsub@snap2 '$userprop:snap2'" | |
73 | + "$destsub@snap3 '$userprop:snap' '$userval' received" | |
74 | +log_must eval "check_prop_missing $dest@snap3 '$userprop:snap3'" | |
75 | +log_must eval "check_prop_missing $destsub@snap3 '$userprop:snap3'" | |
76 | # Cleanup | |
77 | log_must zfs destroy -r -f $orig | |
78 | log_must zfs destroy -r -f $dest | |
79 | @@ -270,7 +271,8 @@ log_must eval "zfs set compression=gzip $dest" | |
80 | log_must eval "zfs set '$userprop:dest'='localval' $dest" | |
81 | # Receive the new stream, verify we preserve locally set properties | |
82 | log_must zfs snapshot -r $orig@snap2 | |
83 | -log_must eval "zfs send -R -I $orig@snap1 $orig@snap2 > $streamfile_incr" | |
84 | +log_must zfs snapshot -r $orig@snap3 | |
85 | +log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr" | |
86 | log_must eval "zfs recv -F -x copies -x compression -x '$userprop:orig' " \ | |
87 | "-x '$userprop:dest' $dest < $streamfile_incr" | |
88 | log_must eval "check_prop_source $dest '$userprop:dest' 'localval' local" | |
89 | @@ -305,7 +307,8 @@ log_must eval "check_prop_source $destsub quota 0 default" | |
90 | log_must eval "zfs set quota=123456789 $dest" | |
91 | log_must eval "zfs set canmount=off $destsub" | |
92 | log_must zfs snapshot -r $orig@snap2 | |
93 | -log_must eval "zfs send -R -I $orig@snap1 $orig@snap2 > $streamfile_incr" | |
94 | +log_must zfs snapshot -r $orig@snap3 | |
95 | +log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr" | |
96 | log_must eval "zfs recv -F -x quota -x canmount $dest < $streamfile_incr" | |
97 | log_must eval "check_prop_source $dest quota 123456789 local" | |
98 | log_must eval "check_prop_source $destsub quota 0 default" | |
99 | @@ -332,7 +335,8 @@ log_must eval "zfs set '$userprop:origsub'='$userval' $destsub" | |
100 | mntpnt=$(get_prop mountpoint $orig) | |
101 | log_must eval "dd if=/dev/urandom of=$mntpnt/file bs=1024k count=10" | |
102 | log_must zfs snapshot -r $orig@snap2 | |
103 | -log_must eval "zfs send -R -I $orig@snap1 $orig@snap2 > $streamfile_incr" | |
104 | +log_must zfs snapshot -r $orig@snap3 | |
105 | +log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr" | |
106 | log_must eval "dd if=$streamfile_incr of=$streamfile_trun bs=1024k count=9" | |
107 | # Receive the truncated stream, verify original properties are kept | |
108 | log_mustnot eval "zfs recv -F -o copies=3 -o quota=987654321 "\ |