| #! /bin/bash | 
 | # SPDX-License-Identifier: GPL-2.0 | 
 | # Copyright (c) 2015 Oracle, Inc.  All Rights Reserved. | 
 | # | 
 | # FS QA Test No. 170 | 
 | # | 
 | # Test for races or FS corruption when DIO writing to a file that's also | 
 | # the target of a reflink operation. | 
 | # | 
 | . ./common/preamble | 
 | _begin_fstest auto clone | 
 |  | 
 | _register_cleanup "_cleanup" BUS | 
 |  | 
 | # Override the default cleanup function. | 
 | _cleanup() | 
 | { | 
 |     cd / | 
 |     rm -rf $tmp.* $finished_file | 
 |     wait | 
 | } | 
 |  | 
 | # Import common functions. | 
 | . ./common/filter | 
 | . ./common/reflink | 
 |  | 
 | _require_scratch_reflink | 
 | _require_odirect | 
 |  | 
 | 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 | 
 | _require_congruent_file_oplen $SCRATCH_MNT $blksz | 
 |  | 
 | 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 | 
 |  | 
 | # Direct I/O overwriter... | 
 | overwrite() { | 
 | 	while [ ! -e $finished_file ]; do | 
 | 		seq $nr_loops -1 0 | while read i; do | 
 | 			_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file2 >> $seqres.full | 
 | 		done | 
 | 	done | 
 | } | 
 |  | 
 | echo "Reflink and dio 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 |