| #!/bin/bash | 
 | # SPDX-License-Identifier: GPL-2.0 | 
 | # Copyright (c) 2017 Plexistor Ltd. All Rights Reserved. | 
 | # | 
 | # FS QA Test No. 415 | 
 | # | 
 | # test for races between write or fpunch operations on reflinked files | 
 | # to read operations on the target file | 
 | # | 
 | . ./common/preamble | 
 | _begin_fstest auto clone punch | 
 |  | 
 | status=0    # success is the default! | 
 |  | 
 | # Import common functions. | 
 | . ./common/reflink | 
 |  | 
 | # real QA test starts here | 
 | _supported_fs generic | 
 | _require_scratch_reflink | 
 | _require_cp_reflink | 
 | _require_xfs_io_command "fpunch" | 
 |  | 
 | _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" | 
 | _scratch_mount || _fail "mount failed" | 
 | _require_fs_space $SCRATCH_MNT $((250 * 1024)) | 
 |  | 
 | echo "Silence is golden" | 
 |  | 
 | workfile=${SCRATCH_MNT}/workfile | 
 | light_clone=${SCRATCH_MNT}/light_clone | 
 |  | 
 | file_size=$((10 * 1024 * 1024)) | 
 | bs=`_get_block_size $SCRATCH_MNT` | 
 | block_num=$((file_size / bs)) | 
 | reflinks_num=20 | 
 |  | 
 | $XFS_IO_PROG -f -c "pwrite 0 $file_size" $workfile >> $seqres.full | 
 |  | 
 | for ((i=1; i<=reflinks_num; i++)); do | 
 | 	_cp_reflink $workfile ${light_clone}_$i | 
 | done | 
 |  | 
 | # for each block simultaneously pwrite (or fpunch) all reflinks | 
 | # while performing pread from the targted file | 
 | for ((block_index=0; block_index<block_num; block_index++)); do | 
 | 	for ((i=1; i<=reflinks_num; i++)); do | 
 | 		$XFS_IO_PROG -c "pread $((block_index * bs)) $bs" \ | 
 | 					$workfile >> $seqres.full & | 
 | 		if [ $((block_index % 2)) -eq 0 ]; then | 
 | 			$XFS_IO_PROG -c "pwrite $((block_index * bs)) $bs" \ | 
 | 					${light_clone}_$i  >> $seqres.full & | 
 | 		else | 
 | 			$XFS_IO_PROG -c "fpunch $((block_index * bs)) $bs" \ | 
 | 					${light_clone}_$i >> $seqres.full & | 
 | 		fi | 
 | 	done | 
 | 	# wait for all threads to join before moving to next block | 
 | 	wait | 
 | done | 
 |  | 
 | # success, all done | 
 | status=0 | 
 | exit |