mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Fix unallocated object detection for large_dnode datasets
Fix dmu_object_next() to correctly handle unallocated objects on large_dnode datasets. We implement this by scanning the dnode block until we find the correct offset to be used in dnode_next_offset(). This is necessary because we can't assume *objectp is a hole even if dmu_object_info() returns ENOENT. This fixes a couple of issues with zfs receive on large_dnode datasets. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ned Bass <bass6@llnl.gov> Signed-off-by: loli10K <ezomori.nozomu@gmail.com> Closes #5027 Closes #5532
This commit is contained in:
@@ -27,9 +27,11 @@ verify_runnable "both"
|
||||
TEST_SEND_FS=$TESTPOOL/send_large_dnode
|
||||
TEST_RECV_FS=$TESTPOOL/recv_large_dnode
|
||||
TEST_SNAP=$TEST_SEND_FS@ldnsnap
|
||||
TEST_SNAPINCR=$TEST_SEND_FS@ldnsnap_incr
|
||||
TEST_STREAM=$TESTDIR/ldnsnap
|
||||
TEST_STREAMINCR=$TESTDIR/ldnsnap_incr
|
||||
TEST_FILE=foo
|
||||
|
||||
TEST_FILEINCR=bar
|
||||
|
||||
function cleanup
|
||||
{
|
||||
@@ -42,6 +44,7 @@ function cleanup
|
||||
fi
|
||||
|
||||
rm -f $TEST_STREAM
|
||||
rm -f $TEST_STREAMINCR
|
||||
}
|
||||
|
||||
log_onexit cleanup
|
||||
@@ -49,10 +52,13 @@ log_onexit cleanup
|
||||
log_assert "zfs send stream with large dnodes accepted by new pool"
|
||||
|
||||
log_must $ZFS create -o dnodesize=1k $TEST_SEND_FS
|
||||
log_must touch /$TEST_SEND_FS/$TEST_FILE
|
||||
log_must $ZFS umount $TEST_SEND_FS
|
||||
log_must $TOUCH /$TEST_SEND_FS/$TEST_FILE
|
||||
log_must $ZFS snap $TEST_SNAP
|
||||
log_must $ZFS send $TEST_SNAP > $TEST_STREAM
|
||||
log_must $RM -f /$TEST_SEND_FS/$TEST_FILE
|
||||
log_must $TOUCH /$TEST_SEND_FS/$TEST_FILEINCR
|
||||
log_must $ZFS snap $TEST_SNAPINCR
|
||||
log_must $ZFS send -i $TEST_SNAP $TEST_SNAPINCR > $TEST_STREAMINCR
|
||||
|
||||
log_must eval "$ZFS recv $TEST_RECV_FS < $TEST_STREAM"
|
||||
inode=$(ls -li /$TEST_RECV_FS/$TEST_FILE | awk '{print $1}')
|
||||
@@ -61,4 +67,9 @@ if [[ "$dnsize" != "1K" ]]; then
|
||||
log_fail "dnode size is $dnsize (expected 1K)"
|
||||
fi
|
||||
|
||||
log_must eval "$ZFS recv -F $TEST_RECV_FS < $TEST_STREAMINCR"
|
||||
log_must $DIFF -r /$TEST_SEND_FS /$TEST_RECV_FS
|
||||
log_must $ZFS umount $TEST_SEND_FS
|
||||
log_must $ZFS umount $TEST_RECV_FS
|
||||
|
||||
log_pass
|
||||
|
||||
Reference in New Issue
Block a user