#! /bin/bash
# FS QA Test No. 211
#
# Test fragmentation in a big file after a lot of random CoW:
# - Create two reflinked files.  Set extsz hint on second file.
# - Directio write to random offsets to scatter CoW reservations.
# - Rewrite the whole file to use up reservations.
# - 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_odirect

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=50000
filesize=$((blksz * nr))
bufnr=16
bufsize=$((blksz * bufnr))

_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 2 * 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
$XFS_IO_PROG -d -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $((filesize + 1))" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -d -f -c "pwrite -S 0x63 -b 8388608 0 $filesize" $testdir/file2 >> $seqres.full
_scratch_cycle_mount

echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
	|| echo "file2 badly fragmented"

# success, all done
status=0
exit
