diff options
author | Tom Caputi <[email protected]> | 2018-04-17 14:13:57 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-04-17 11:13:57 -0700 |
commit | e14a32b1c844d924b9f093375c0badcf10f61741 (patch) | |
tree | 933a0515c9755a3b8ef854221a45c2de2e1112fc /tests/zfs-tests | |
parent | 0c03d21ac99ebdbefe65c319fc3712928c40af78 (diff) |
Fix object reclaim when using large dnodes
Currently, when the receive_object() code wants to reclaim an
object, it always assumes that the dnode is the legacy 512 bytes,
even when the incoming bonus buffer exceeds this length. This
causes a buffer overflow if --enable-debug is not provided and
triggers an ASSERT if it is. This patch resolves this issue and
adds an ASSERT to ensure this can't happen again.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #7097
Closes #7433
Diffstat (limited to 'tests/zfs-tests')
-rwxr-xr-x | tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh b/tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh index 206763949..12a72fa09 100755 --- a/tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh +++ b/tests/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh @@ -13,6 +13,7 @@ # # Copyright (c) 2017 by Lawrence Livermore National Security, LLC. +# Copyright (c) 2018 Datto Inc. # . $STF_SUITE/include/libtest.shlib @@ -31,8 +32,10 @@ # 3. Remove objects, set dnodesize=2k, and remount dataset so new objects # overlap with recently recycled and formerly "normal" dnode slots get # assigned to new objects -# 4. Generate initial and incremental streams -# 5. Verify initial and incremental streams can be received +# 4. Create an empty file and add xattrs to it to exercise reclaiming a +# dnode that requires more than 1 slot for its bonus buffer (Zol #7433) +# 5. Generate initial and incremental streams +# 6. Verify initial and incremental streams can be received # verify_runnable "both" @@ -44,6 +47,7 @@ function cleanup rm -f $BACKDIR/fs-dn-legacy rm -f $BACKDIR/fs-dn-1k rm -f $BACKDIR/fs-dn-2k + rm -f $BACKDIR/fs-attr if datasetexists $POOL/fs ; then log_must zfs destroy -rR $POOL/fs @@ -82,17 +86,26 @@ log_must zfs unmount $POOL/fs log_must zfs set dnodesize=2k $POOL/fs log_must zfs mount $POOL/fs +log_must touch /$POOL/fs/attrs mk_files 200 262144 0 $POOL/fs log_must zfs snapshot $POOL/fs@c -# 4. Generate initial and incremental streams +# 4. Create an empty file and add xattrs to it to exercise reclaiming a +# dnode that requires more than 1 slot for its bonus buffer (Zol #7433) +log_must zfs set compression=on xattr=sa $POOL/fs +log_must eval "python -c 'print \"a\" * 512' | attr -s bigval /$POOL/fs/attrs" +log_must zfs snapshot $POOL/fs@d + +# 5. Generate initial and incremental streams log_must eval "zfs send $POOL/fs@a > $BACKDIR/fs-dn-1k" log_must eval "zfs send -i $POOL/fs@a $POOL/fs@b > $BACKDIR/fs-dn-legacy" log_must eval "zfs send -i $POOL/fs@b $POOL/fs@c > $BACKDIR/fs-dn-2k" +log_must eval "zfs send -i $POOL/fs@c $POOL/fs@d > $BACKDIR/fs-attr" -# 5. Verify initial and incremental streams can be received +# 6. Verify initial and incremental streams can be received log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-1k" log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-legacy" log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-2k" +log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-attr" log_pass "Verify incremental receive handles objects with changed dnode size" |