When iterating over the input nvlist in `dsl_props_set_sync_impl()` when we
don't preserve the nvpair name before looking up `ZPROP_VALUE`, so when we
later go to process it `nvpair_name()` is always "value" instead of the actual
property name.
These are properties set on a filesystem when failing to receive a truncated
stream:
```
[root@52-54-00-d3-7a-01 ~]# zdb -dddd testpool 49
Dataset mos [META], ID 0, cr_txg 4, 114K, 64 objects, rootbp
DVA[0]=<0:17b2e00:200> DVA[1]=<0:17b3000:200> DVA[2]=<0:17b3200:200> [L0 DMU
objset] fletcher4 lz4 LE contiguous unique triple size=800L/200P
birth=498L/498P fill=64
cksum=11413d065e:672e12e9d76:13ff1f57e066a:2ac3890cc2454c
Object lvl iblk dblk dsize lsize %full type
49 1 128K 512 0 512 100.00 DSL props
dnode flags: USED_BYTES
dnode maxblkid: 0
microzap: 512 bytes, 2 entries
value$recvd = 1
$hasrecvd = 0
```
References: https://github.com/zfsonlinux/zfs/pull/5497
Reproducer:
```
# misc functions
function is_linux() {
if [[ "$(uname)" == "Linux" ]]; then
return 0
else
return 1
fi
}
# setup
POOLNAME='testpool'
if is_linux; then
TMPDIR='/var/tmp'
mountpoint -q $TMPDIR || mount -t tmpfs tmpfs $TMPDIR
zpool destroy $POOLNAME
fallocate -l 65m $TMPDIR/zpool.dat
zpool create $POOLNAME $TMPDIR/zpool.dat
else
TMPDIR='/tmp'
zpool destroy $POOLNAME
mkfile 65m $TMPDIR/zpool.dat
zpool create $POOLNAME $TMPDIR/zpool.dat
fi
# send first stream, received compression is 'on'
zfs create $POOLNAME/send
zfs set compression=on $POOLNAME/send
zfs snap $POOLNAME/send@snap1
zfs send -p $POOLNAME/send@snap1 > $TMPDIR/snap_full.dat
zfs recv $POOLNAME/recv < $TMPDIR/snap_full.dat
zfs get -o all compression $POOLNAME/recv
# send second stream, compression is 'lz4'
zfs set compression=lz4 $POOLNAME/send
dd if=/dev/urandom of=/$POOLNAME/send/urandom bs=1M count=10
zfs snap $POOLNAME/send@snap2
zfs send -pI $POOLNAME/send@snap1 $POOLNAME/send@snap2 > $TMPDIR/snap_incr.dat
# truncate the stream, fail to receive incremental
dd if=/dev/null of=$TMPDIR/snap_incr.dat bs=1 count=1 seek=9M
zfs recv -F $POOLNAME/recv < $TMPDIR/snap_incr.dat
# zfs receive failed, compression should be 'on'
zfs get -o all compression $POOLNAME/recv
```
You can view, comment on, or merge this pull request online at:
https://github.com/openzfs/openzfs/pull/405
-- Commit Summary --
* 8408 dsl_props_set_sync_impl() does not handle nested nvlists correctly
-- File Changes --
M usr/src/pkg/manifests/system-test-zfstest.mf (3)
M usr/src/test/zfs-tests/runfiles/delphix.run (2)
M usr/src/test/zfs-tests/runfiles/omnios.run (3)
M usr/src/test/zfs-tests/runfiles/openindiana.run (3)
A
usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_014_pos.ksh
(122)
M usr/src/uts/common/fs/zfs/dsl_prop.c (14)
-- Patch Links --
https://github.com/openzfs/openzfs/pull/405.patch
https://github.com/openzfs/openzfs/pull/405.diff
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/openzfs/openzfs/pull/405
------------------------------------------
openzfs-developer
Archives:
https://openzfs.topicbox.com/groups/developer/discussions/Tb439a95d6a3fef31-M25ca70bc6156e4234a3ae449
Powered by Topicbox: https://topicbox.com