#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # # FS QA Test No. 672 # # Test for races or FS corruption when mmap writing to a file that's also # the target of a reflink operation. (MMAP version of generic/168,170) # . ./common/preamble _begin_fstest auto clone _register_cleanup "_cleanup" BUS # Import common functions. . ./common/filter . ./common/reflink # real QA test starts here _require_scratch_reflink echo "Format and mount" _scratch_mkfs > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 testdir=$SCRATCH_MNT/test-$seq finished_file=/tmp/finished rm -rf $finished_file mkdir $testdir loops=1024 nr_loops=$((loops - 1)) blksz=65536 echo "Initialize files" echo >> $seqres.full _pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file1 >> $seqres.full _pwrite_byte 0x62 0 $((loops * blksz)) $testdir/file2 >> $seqres.full _scratch_cycle_mount # mmap overwriter... overwrite() { while [ ! -e $finished_file ]; do seq $nr_loops -1 0 | while read i; do $XFS_IO_PROG -f -c "mmap -rw $((i * blksz)) $blksz" \ -c "mwrite -S 0x63 $((i * blksz)) $blksz" $testdir/file2 >> $seqres.full done done } echo "Reflink and mmap write the target" overwrite & seq 1 10 | while read j; do seq 0 $nr_loops | while read i; do _reflink_range $testdir/file1 $((i * blksz)) \ $testdir/file2 $((i * blksz)) $blksz >> $seqres.full [ $? -ne 0 ] && exit done done touch $finished_file wait # success, all done status=0 exit