#! /bin/bash
# FS QA Test No. 238
#
# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when
# the surrounding blocks vary between unwritten/regular/delalloc/hole.
#
# This test is dependent on the system page size, so we cannot use md5 in
# the golden output; we can only compare to a check file.
#
#-----------------------------------------------------------------------
# Copyright (c) 2015, Oracle and/or its affiliates.  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 15

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

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

# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_xfs_io_command "falloc"
_require_odirect

rm -f $seqres.full

pagesz=$(getconf PAGE_SIZE)
blksz=$((pagesz / 4))

echo "Format and mount"
_scratch_mkfs_blocksized $blksz > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1

testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir

real_blksz=$(_get_file_block_size $testdir)
test $real_blksz != $blksz && _notrun "Failed to format with small blocksize."

runtest() {
	echo "runtest $1 $2"
	b2=$1
	b4=$2
	dir=$3

	echo "Create the original files"
	mkdir -p $dir
	_pwrite_byte 0x61 0 $pagesz $dir/file1 >> $seqres.full

	$XFS_IO_PROG -f -c "truncate $pagesz" $dir/file2 >> $seqres.full
	$XFS_IO_PROG -f -c "truncate $pagesz" $dir/file2.chk >> $seqres.full

	case $b2 in
	"regular")
		_pwrite_byte 0x61 $blksz $blksz $dir/file2 >> $seqres.full
		_pwrite_byte 0x61 $blksz $blksz $dir/file2.chk >> $seqres.full
		;;
	"unwritten")
		$XFS_IO_PROG -f -c "falloc -k $blksz $blksz" $dir/file2 >> $seqres.full
		_pwrite_byte 0x00 $blksz $blksz $dir/file2.chk >> $seqres.full
		;;
	"hole")
		;;
	esac



	case $b4 in
	"regular")
		_pwrite_byte 0x61 $((blksz * 3)) $blksz $dir/file2 >> $seqres.full
		_pwrite_byte 0x61 $((blksz * 3)) $blksz $dir/file2.chk >> $seqres.full
		;;
	"unwritten")
		$XFS_IO_PROG -f -c "falloc -k $((blksz * 3)) $blksz" $dir/file2 >> $seqres.full
		_pwrite_byte 0x00 $((blksz * 3)) $blksz $dir/file2.chk >> $seqres.full
		;;
	"hole")
		;;
	esac

	_reflink_range $dir/file1 $blksz $dir/file2 $((blksz * 2)) $blksz >> $seqres.full
	_pwrite_byte 0x61 $((blksz * 2)) $blksz $dir/file2.chk >> $seqres.full
	_scratch_cycle_mount

	echo "Compare files"
	! cmp -s $dir/file1 $dir/file2 || _fail "file1 and file2 don't match."
	cmp -s $dir/file2 $dir/file2.chk || _fail "file2 and file2.chk don't match."

	echo "CoW and unmount"
	if [ $b2 = "delalloc" ]; then
		_pwrite_byte 0x61 $blksz $blksz $dir/file2 >> $seqres.full
		_pwrite_byte 0x61 $blksz $blksz $dir/file2.chk >> $seqres.full
	fi

	if [ $b4 = "delalloc" ]; then
		_pwrite_byte 0x61 $((blksz * 3)) $blksz $dir/file2 >> $seqres.full
		_pwrite_byte 0x61 $((blksz * 3)) $blksz $dir/file2.chk >> $seqres.full
	fi

	$XFS_IO_PROG -d -f -c "pwrite -S 0x63 $blksz $((blksz * 3))" $dir/file2 >> $seqres.full
	$XFS_IO_PROG -f -c "pwrite -S 0x63 $blksz $((blksz * 3))" $dir/file2.chk >> $seqres.full
	_scratch_cycle_mount

	echo "Compare files"
	! cmp -s $dir/file1 $dir/file2 || _fail "file1 and file2 don't match."
	cmp -s $dir/file2 $dir/file2.chk || _fail "file2 and file2.chk don't match."
}

runtest regular delalloc "$testdir/r-d"
runtest regular unwritten "$testdir/r-u"
runtest regular hole "$testdir/r-h"
runtest regular regular "$testdir/r-r"

runtest hole delalloc "$testdir/h-d"
runtest hole unwritten "$testdir/h-u"
runtest hole hole "$testdir/h-h"
runtest hole regular "$testdir/h-r"

runtest unwritten delalloc "$testdir/u-d"
runtest unwritten unwritten "$testdir/u-u"
runtest unwritten hole "$testdir/u-h"
runtest unwritten regular "$testdir/u-r"

runtest delalloc delalloc "$testdir/d-d"
runtest delalloc unwritten "$testdir/d-u"
runtest delalloc hole "$testdir/d-h"
runtest delalloc regular "$testdir/d-r"

# success, all done
status=0
exit
