#! /bin/bash
# FS QA Test No. 347
#
# Test fragmentation after writing and dropping CoW extent hint reservation:
# - Create two reflinked files.  Set extsz hint on second file.
# - Buffered write to random offsets to scatter CoW reservations.
# - Unmount, remount, repeat (twice more).
# - Check the number of extents.
#
#-----------------------------------------------------------------------
# Copyright (c) 2016, 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.*
}

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

# real QA test starts here
_supported_os Linux
_supported_fs xfs
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "fiemap"
_require_xfs_io_command "cowextsize"
_require_xfs_io_command "funshare"

rm -f $seqres.full

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

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

blksz=65536
nr=128
filesize=$((blksz * nr))
bufnr=8
bufsize=$((blksz * bufnr))

_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4))
real_blksz=$(_get_block_size $testdir)
internal_blks=$((filesize / real_blksz))

echo "Create the original files"
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $((filesize + 1))" $testdir/file1 >> $seqres.full
$XFS_IO_PROG -f -c "cowextsize $bufsize" $testdir/file2
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_scratch_cycle_mount

echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch

echo "CoW and unmount"
$XFS_IO_PROG -f -c "cowextsize" $testdir/file2 >> $seqres.full
seq 1 10 | while read i; do
	$XFS_IO_PROG -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" $testdir/file2 >> $seqres.full
	_scratch_cycle_mount
done
$XFS_IO_PROG -f -c "funshare 0 $filesize" $testdir/file2 >> $seqres.full
_scratch_cycle_mount

echo "Compare files"
md5sum $testdir/file1 | _filter_scratch

echo "Check extent counts"
old_extents=$(_count_extents $testdir/file1)
new_extents=$(_count_extents $testdir/file2)

echo "old extents: $old_extents" >> $seqres.full
echo "new extents: $new_extents" >> $seqres.full
echo "maximum extents: $internal_blks" >> $seqres.full

# success, all done
status=0
exit
