]> git.proxmox.com Git - zfsonlinux.git/blame - zfs-patches/0021-Fix-zfs-incremental-send-remove-o-properties.patch
bump version to 0.7.11-pve1~bpo1
[zfsonlinux.git] / zfs-patches / 0021-Fix-zfs-incremental-send-remove-o-properties.patch
CommitLineData
a010b409
SI
1From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2From: LOLi <loli10K@users.noreply.github.com>
3Date: Tue, 1 May 2018 05:58:29 +0200
4Subject: [PATCH] Fix zfs incremental send remove '-o' properties
5
6When receiving an incremental send stream with intermediary snapshots
7zfs_receive_one() does not correctly identify the top-level dataset:
8consequently we restore said snapshots as if they were children
9datasets in the hierarchy, forcing inheritance of any property received
10with 'zfs send -o' and effectively removing any locally set value.
11
12The test case did not correctly verify this situation because it uses
13adjacent snapshots, basically testing 'zfs send -i' instead of
14'zfs send -I': this commit adds an additional intermediary snapshot to
15the test script.
16
17Reviewed-by: Paul Dagnelie <pcd@delphix.com>
18Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
19Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
20Closes #7478
21
22Signed-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
28diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
29index 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;
41diff --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
42index 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 "\