[ZFS] Potential silent data corruption when receiving incremental stream with block size change on receiving side

Fabian Keil freebsd-listen at fabiankeil.de
Mon Aug 7 16:11:20 UTC 2017


The problem described in:
https://github.com/zfsonlinux/zfs/issues/6224
is reproducible on FreeBSD-based systems.

The reproducer script doesn't work as is, but a slightly modified
version of it does:
https://www.fabiankeil.de/tmp/reproduce-zfsonlinux-bug-6224.sh

I've reproduced the problem on a system based on 11-STABLE r322045
but suspect that CURRENT is affected as well.

While the Github issue is titled "Silent corruption in incremental
send without -L flag with large block pool" I only became aware
of the ZFSonLinux bug after discovering silent data loss after
receiving an incremental stream that was sent with the -L flag:

[fk at test-vm ~]$ hd /usr/test/src/sbin/camcontrol/camcontrol.c
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0003ea10
[fk at test-vm ~]$ sudo zdb -ddddddd -bbbbbbb rpool/test/src $(stat -f '%i' /usr/test/src/sbin/camcontrol/camcontrol.c)
Dataset rpool/test/src [ZPL], ID 550, cr_txg 67575, 704M, 78457 objects, rootbp DVA[0]=<0:254bfb000:1000> DVA[1]=<0:3803b7000:1000> [L0 DMU objset] sha256 uncompressed LE contiguous unique double size=800L/800P birth=67755L/67755P fill=78457 cksum=fb0fd08b71ffb3f8:e14c2e477498cdc4:4822440c7db2cccc:9fa4961bce0031b6

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
    100844    2   128K   251K      0   251K    0.00  ZFS plain file (K=inherit) (Z=inherit)
                                        168   bonus  System attributes
	dnode flags: USED_BYTES USERUSED_ACCOUNTED 
	dnode maxblkid: 0
	path	/sbin/camcontrol/camcontrol.c
	uid     1001
	gid     1001
	atime	Sat Jul  8 18:41:59 2017
	mtime	Sat Jul  8 18:41:59 2017
	ctime	Sat Jul  8 18:41:59 2017
	crtime	Sat Jul  8 18:41:59 2017
	gen	609632
	mode	100644
	size	256529
	parent	44643
	links	1
	pflags	40800000004
Indirect blocks:
               0 L1  HOLE [L1 ZFS plain file] size=20000L birth=67755L

		segment [0000000000000000, 000000000003ec00) size  251K

In case of my incremental /usr/src transfer the data corruption is only
reproducible when not setting the -L flag so blindly omitting the flag
is not a reliable workaround.

While I hope that this is a recent regression I didn't have time to
bisect it yet.

Fabian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/freebsd-fs/attachments/20170807/c52ce39f/attachment.sig>


More information about the freebsd-fs mailing list