From 96de24c84af94ec003f14e65b4f5145ea7125af5 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Tue, 9 Feb 2016 23:47:22 -0800 Subject: [PATCH] reflink: refactor mixed block creation code Refactor the code that creates files with mixed block types that we feed into CoW tests to make sure that we can tiptoe around that kind of stuff. Signed-off-by: Darrick J. Wong --- common/reflink | 108 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/188 | 8 +--- tests/generic/189 | 8 +--- tests/generic/190 | 8 +--- tests/generic/191 | 8 +--- tests/generic/194 | 13 +---- tests/generic/195 | 13 +---- tests/generic/196 | 8 +--- tests/generic/197 | 8 +--- tests/generic/199 | 31 +----------- tests/generic/199.out | 4 +- tests/generic/200 | 31 +----------- tests/generic/200.out | 4 +- 13 files changed, 126 insertions(+), 126 deletions(-) diff --git a/common/reflink b/common/reflink index 3d6a8c14..b92f6646 100644 --- a/common/reflink +++ b/common/reflink @@ -187,3 +187,111 @@ _dedupe_range() { "$XFS_IO_PROG" $xfs_io_args -f -c "dedupe $file1 $offset1 $offset2 $len" "$file2" } + +# Create a file of interleaved unwritten and reflinked blocks +_weave_reflink_unwritten() { + blksz=$1 + nr=$2 + sfile=$3 + dfile=$4 + + _pwrite_byte 0x61 0 $((blksz * nr)) $sfile + $XFS_IO_PROG -f -c "falloc 0 $((blksz * nr))" $dfile + _pwrite_byte 0x00 0 $((blksz * nr)) $dfile.chk + seq 0 2 $((nr - 1)) | while read i; do + _reflink_range $sfile $((blksz * i)) $dfile $((blksz * i)) $blksz + _pwrite_byte 0x61 $((blksz * i)) $blksz $dfile.chk + done +} + +# Create a file of interleaved holes and reflinked blocks +_weave_reflink_holes() { + blksz=$1 + nr=$2 + sfile=$3 + dfile=$4 + + _pwrite_byte 0x61 0 $((blksz * nr)) $sfile + $XFS_IO_PROG -f -c "truncate $((blksz * nr))" $dfile + _pwrite_byte 0x00 0 $((blksz * nr)) $dfile.chk + seq 0 2 $((nr - 1)) | while read i; do + _reflink_range $sfile $((blksz * i)) $dfile $((blksz * i)) $blksz + _pwrite_byte 0x61 $((blksz * i)) $blksz $dfile.chk + done +} + +# For a file created with _weave_reflink_holes, fill the holes with delalloc +# extents +_weave_reflink_holes_delalloc() { + blksz=$1 + nr=$2 + dfile=$3 + + seq 1 2 $((nr - 1)) | while read i; do + _pwrite_byte 0x62 $((blksz * i)) $blksz $dfile + _pwrite_byte 0x62 $((blksz * i)) $blksz $dfile.chk + done +} + +# Create a file of interleaved regular blocks and reflinked blocks +_weave_reflink_regular() { + blksz=$1 + nr=$2 + sfile=$3 + dfile=$4 + + _pwrite_byte 0x61 0 $((blksz * nr)) $sfile + _pwrite_byte 0x62 0 $((blksz * nr)) $dfile + _pwrite_byte 0x62 0 $((blksz * nr)) $dfile.chk + seq 0 2 $((nr - 1)) | while read i; do + _reflink_range $sfile $((blksz * i)) $dfile $((blksz * i)) $blksz + _pwrite_byte 0x61 $((blksz * i)) $blksz $dfile.chk + done +} + +# Create a file of interleaved holes, unwritten blocks, regular blocks, and +# reflinked blocks +_weave_reflink_rainbow() { + blksz=$1 + nr=$2 + sfile=$3 + dfile=$4 + + _pwrite_byte 0x61 0 $((blksz * nr)) $sfile + $XFS_IO_PROG -f -c "truncate $((blksz * nr))" $dfile + _pwrite_byte 0x00 0 $((blksz * nr)) $dfile.chk + # 0 blocks are reflinked + seq 0 5 $((nr - 1)) | while read i; do + _reflink_range $sfile $((blksz * i)) $dfile $((blksz * i)) $blksz + _pwrite_byte 0x61 $((blksz * i)) $blksz $dfile.chk + done + # 1 blocks are unwritten + seq 1 5 $((nr - 1)) | while read i; do + $XFS_IO_PROG -f -c "falloc $((blksz * i)) $blksz" $dfile + _pwrite_byte 0x00 $((blksz * i)) $blksz $dfile.chk + done + # 2 blocks are holes + seq 2 5 $((nr - 1)) | while read i; do + _pwrite_byte 0x00 $((blksz * i)) $blksz $dfile.chk + done + # 3 blocks are regular + seq 3 5 $((nr - 1)) | while read i; do + _pwrite_byte 0x71 $((blksz * i)) $blksz $dfile + _pwrite_byte 0x71 $((blksz * i)) $blksz $dfile.chk + done + # 4 blocks will be delalloc later +} + +# For a file created with _weave_reflink_rainbow, fill the holes with delalloc +# extents +_weave_reflink_rainbow_delalloc() { + blksz=$1 + nr=$2 + dfile=$3 + + # 4 blocks are delalloc (do later) + seq 4 5 $((nr - 1)) | while read i; do + _pwrite_byte 0x62 $((blksz * i)) $blksz $dfile + _pwrite_byte 0x62 $((blksz * i)) $blksz $dfile.chk + done +} diff --git a/tests/generic/188 b/tests/generic/188 index 7596c4b9..86980cce 100755 --- a/tests/generic/188 +++ b/tests/generic/188 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "falloc 0 $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_unwritten $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/189 b/tests/generic/189 index 130dc58a..8f5a338a 100755 --- a/tests/generic/189 +++ b/tests/generic/189 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "falloc 0 $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_unwritten $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/190 b/tests/generic/190 index 01714753..8edfeb7e 100755 --- a/tests/generic/190 +++ b/tests/generic/190 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/191 b/tests/generic/191 index 34d96f95..dd97baad 100755 --- a/tests/generic/191 +++ b/tests/generic/191 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/194 b/tests/generic/194 index e9feaadf..82b31009 100755 --- a/tests/generic/194 +++ b/tests/generic/194 @@ -64,13 +64,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" @@ -79,10 +73,7 @@ md5sum "$testdir/file3" | _filter_scratch md5sum "$testdir/file3.chk" | _filter_scratch echo "directio CoW across the transition" -seq 1 2 $((nr-1)) | while read f; do - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes_delalloc $blksz $nr $testdir/file3 >> $seqres.full "$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 -b $((blksz * nr / 2)) $((blksz * nr / 4)) $((blksz * nr / 2))" "$testdir/file3" >> "$seqres.full" _pwrite_byte 0x63 $((blksz * nr / 4)) $((blksz * nr / 2)) "$testdir/file3.chk" >> "$seqres.full" _scratch_remount diff --git a/tests/generic/195 b/tests/generic/195 index 32548baa..ce4c0a9b 100755 --- a/tests/generic/195 +++ b/tests/generic/195 @@ -64,13 +64,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x00 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" @@ -79,10 +73,7 @@ md5sum "$testdir/file3" | _filter_scratch md5sum "$testdir/file3.chk" | _filter_scratch echo "CoW across the transition" -seq 1 2 $((nr-1)) | while read f; do - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_holes_delalloc $blksz $nr $testdir/file3 >> $seqres.full "$XFS_IO_PROG" -f -c "pwrite -S 0x63 -b $((blksz * nr / 2)) $((blksz * nr / 4)) $((blksz * nr / 2))" "$testdir/file3" >> "$seqres.full" _pwrite_byte 0x63 $((blksz * nr / 4)) $((blksz * nr / 2)) "$testdir/file3.chk" >> "$seqres.full" _scratch_remount diff --git a/tests/generic/196 b/tests/generic/196 index 4ec2cffb..a7a0035b 100755 --- a/tests/generic/196 +++ b/tests/generic/196 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -_pwrite_byte 0x62 0 $((blksz * nr)) "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x62 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_regular $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/197 b/tests/generic/197 index 356a587b..84a14ffe 100755 --- a/tests/generic/197 +++ b/tests/generic/197 @@ -63,13 +63,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -_pwrite_byte 0x62 0 $((blksz * nr)) "$testdir/file3" >> "$seqres.full" -_pwrite_byte 0x62 0 $((blksz * nr)) "$testdir/file3.chk" >> "$seqres.full" -seq 0 2 $((nr-1)) | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_regular $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" diff --git a/tests/generic/199 b/tests/generic/199 index 03b8fdad..6a65533b 100755 --- a/tests/generic/199 +++ b/tests/generic/199 @@ -69,30 +69,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -# 0 blocks are reflinked -seq 0 5 $nr | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync -# 1 blocks are unwritten -seq 1 5 $nr | while read f; do - $XFS_IO_PROG -f -c "falloc $((blksz * f)) $blksz" "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x00 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync -# 2 blocks are holes -seq 2 5 $nr | while read f; do - _pwrite_byte 0x00 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -# 3 blocks are regular -seq 3 5 $nr | while read f; do - _pwrite_byte 0x71 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x71 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" @@ -101,11 +78,7 @@ md5sum "$testdir/file3" | _filter_scratch md5sum "$testdir/file3.chk" | _filter_scratch echo "directio CoW across the transition" -# 4 blocks are delalloc (do later) -seq 4 5 $nr | while read f; do - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full # now cow "$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 -b $((blksz * nr / 2)) $((blksz * nr / 4)) $((blksz * nr / 2))" "$testdir/file3" >> "$seqres.full" _pwrite_byte 0x63 $((blksz * nr / 4)) $((blksz * nr / 2)) "$testdir/file3.chk" >> "$seqres.full" diff --git a/tests/generic/199.out b/tests/generic/199.out index b35c135f..a1016ace 100644 --- a/tests/generic/199.out +++ b/tests/generic/199.out @@ -8,5 +8,5 @@ bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-199/file1 directio CoW across the transition Compare files bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-199/file1 -36f6b5317a9a921fc91175390ccf7f69 SCRATCH_MNT/test-199/file3 -36f6b5317a9a921fc91175390ccf7f69 SCRATCH_MNT/test-199/file3.chk +26aa3a0749b867ec58363c8539ee5471 SCRATCH_MNT/test-199/file3 +26aa3a0749b867ec58363c8539ee5471 SCRATCH_MNT/test-199/file3.chk diff --git a/tests/generic/200 b/tests/generic/200 index e71eedcc..541d16de 100755 --- a/tests/generic/200 +++ b/tests/generic/200 @@ -69,30 +69,7 @@ mkdir $testdir echo "Create the original files" blksz=65536 nr=64 -_pwrite_byte 0x61 0 $((blksz * nr)) "$testdir/file1" >> "$seqres.full" -$XFS_IO_PROG -f -c "truncate $((blksz * nr))" "$testdir/file3" >> "$seqres.full" -# 0 blocks are reflinked -seq 0 5 $nr | while read f; do - _reflink_range "$testdir/file1" $((blksz * f)) "$testdir/file3" $((blksz * f)) $blksz >> "$seqres.full" - _pwrite_byte 0x61 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync -# 1 blocks are unwritten -seq 1 5 $nr | while read f; do - $XFS_IO_PROG -f -c "falloc $((blksz * f)) $blksz" "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x00 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync -# 2 blocks are holes -seq 2 5 $nr | while read f; do - _pwrite_byte 0x00 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -# 3 blocks are regular -seq 3 5 $nr | while read f; do - _pwrite_byte 0x71 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x71 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done -sync +_weave_reflink_rainbow $blksz $nr $testdir/file1 $testdir/file3 >> $seqres.full _scratch_remount echo "Compare files" @@ -101,11 +78,7 @@ md5sum "$testdir/file3" | _filter_scratch md5sum "$testdir/file3.chk" | _filter_scratch echo "directio CoW across the transition" -# 4 blocks are delalloc (do later) -seq 4 5 $nr | while read f; do - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3" >> "$seqres.full" - _pwrite_byte 0x62 $((blksz * f)) $blksz "$testdir/file3.chk" >> "$seqres.full" -done +_weave_reflink_rainbow_delalloc $blksz $nr $testdir/file3 >> $seqres.full # now cow "$XFS_IO_PROG" -f -c "pwrite -S 0x63 -b $((blksz * nr / 2)) $((blksz * nr / 4)) $((blksz * nr / 2))" "$testdir/file3" >> "$seqres.full" _pwrite_byte 0x63 $((blksz * nr / 4)) $((blksz * nr / 2)) "$testdir/file3.chk" >> "$seqres.full" diff --git a/tests/generic/200.out b/tests/generic/200.out index 140eff90..76c01c7f 100644 --- a/tests/generic/200.out +++ b/tests/generic/200.out @@ -8,5 +8,5 @@ bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-200/file1 directio CoW across the transition Compare files bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-200/file1 -36f6b5317a9a921fc91175390ccf7f69 SCRATCH_MNT/test-200/file3 -36f6b5317a9a921fc91175390ccf7f69 SCRATCH_MNT/test-200/file3.chk +26aa3a0749b867ec58363c8539ee5471 SCRATCH_MNT/test-200/file3 +26aa3a0749b867ec58363c8539ee5471 SCRATCH_MNT/test-200/file3.chk -- 2.39.5