#! /bin/bash
# FS QA Test No. 166
#
# Test for races or FS corruption when DIO writing to a file that's also
# the source of a reflink operation.
#
#-----------------------------------------------------------------------
# Copyright (c) 2015 Oracle, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#-----------------------------------------------------------------------
#

seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"

here=`pwd`
tmp=/tmp/$$
status=1	# failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 7 15

_cleanup()
{
    cd /
    rm -rf $tmp.* $finished_file
    wait
}

# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink

# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_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
do_snapshot=/tmp/snapshot
rm -rf $finished_file
mkdir $testdir

loops=1024
nr_loops=$((loops - 1))
blksz=65536

echo "Initialize file"
echo >> $seqres.full
_pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file1 >> $seqres.full
_scratch_cycle_mount

# Snapshot creator...
#
# We rate limit the snapshot creator to one snapshot per full file write.  this
# limits the runtime on slow devices, whilst not substantially reducing the the
# number of snapshots taken on fast devices.
snappy() {
	n=0
	while [ ! -e $finished_file ]; do
		if [ ! -e $do_snapshot ]; then
			sleep 0.01
			continue;
		fi
		out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
		res=$?
		echo "$out" | grep -q "No space left" && break
		test -n "$out" && echo "$out"
		test $res -ne 0 && break
		n=$((n + 1))
		rm -f $do_snapshot
	done
}

echo "Snapshot a file undergoing directio rewrite"
snappy &
seq $nr_loops -1 0 | while read i; do
	_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 >> $seqres.full
	touch $do_snapshot
done
touch $finished_file
wait

# success, all done
status=0
exit
