diff_cb() does not handle large dnodes

Trying to 'zfs diff' a snapshot with large dnodes will incorrectly try
to access its interior slots when dnodesize > sizeof(dnode_phys_t).
This is normally not an issue because the interior slots are
zero-filled, which report_dnode() handles calling
report_free_dnode_range(). However this is not the case for encrypted
large dnodes or filesystem using many SA based xattrs where the extra
data past the legacy dnode size boundary is interpreted as a
dnode_phys_t.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Ryan Moeller <ryan@ixsystems.com>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #7678 
Closes #8931 
Closes #9343
This commit is contained in:
loli10K
2019-09-24 21:01:37 +02:00
committed by Brian Behlendorf
parent 73d7820bba
commit d359e99c38
2 changed files with 15 additions and 4 deletions
@@ -24,14 +24,15 @@
# 1. Create an encrypted dataset
# 2. Create two snapshots of the dataset
# 3. Perform 'zfs diff -Ft' and verify no errors occur
# 4. Perform the same test on a dataset with large dnodes
#
verify_runnable "both"
function cleanup
{
datasetexists $TESTPOOL/$TESTFS1 && \
log_must zfs destroy -r $TESTPOOL/$TESTFS1
destroy_dataset "$TESTPOOL/$TESTFS1" "-r"
destroy_dataset "$TESTPOOL/$TESTFS2" "-r"
}
log_assert "'zfs diff' should work with encrypted datasets"
@@ -50,4 +51,13 @@ log_must zfs snapshot $TESTPOOL/$TESTFS1@snap2
# 3. Perform 'zfs diff' and verify no errors occur
log_must zfs diff -Ft $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1@snap2
# 4. Perform the same test on a dataset with large dnodes
log_must eval "echo 'password' | zfs create -o dnodesize=4k \
-o encryption=on -o keyformat=passphrase $TESTPOOL/$TESTFS2"
MNTPOINT="$(get_prop mountpoint $TESTPOOL/$TESTFS2)"
log_must zfs snapshot $TESTPOOL/$TESTFS2@snap1
log_must touch "$MNTPOINT/file"
log_must zfs snapshot $TESTPOOL/$TESTFS2@snap2
log_must zfs diff -Ft $TESTPOOL/$TESTFS2@snap1 $TESTPOOL/$TESTFS2@snap2
log_pass "'zfs diff' works with encrypted datasets"