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 <darrick.wong@xxxxxxxxxx> --- 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 3d6a8c1..b92f664 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 7596c4b..86980cc 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 130dc58..8f5a338 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 0171475..8edfeb7 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 34d96f9..dd97baa 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 e9feaad..82b3100 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 32548ba..ce4c0a9 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 4ec2cff..a7a0035 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 356a587..84a14ff 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 03b8fda..6a65533 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 b35c135..a1016ac 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 e71eedc..541d16d 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 140eff9..76c01c7 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 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs