#!/bin/bash
#
# Test COW from backing files with AIO
#
# Copyright (C) 2012 Red Hat, Inc.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will 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, see <http://www.gnu.org/licenses/>.
#

# creator
owner=kwolf@redhat.com

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

here=`pwd`
tmp=/tmp/$$
status=1	# failure is the default!

_cleanup()
{
	_cleanup_test_img
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

_supported_fmt qcow2 qed
_supported_proto generic
_supported_os Linux

CLUSTER_SIZE=2M
size=128M

echo
echo "== creating backing file for COW tests =="

_make_test_img $size

function backing_io()
{
    local offset=$1
    local sectors=$2
    local op=$3
    local pattern=0
    local cur_sec=0

    for i in $(seq 0 $((sectors - 1))); do
        cur_sec=$((offset / 65536 + i))
        pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 ))

        echo "$op -P $pattern $((cur_sec * 64))k 64k"
    done
}

backing_io 0 256 write | $QEMU_IO $TEST_IMG | _filter_qemu_io

mv $TEST_IMG $TEST_IMG.base

_make_test_img -b $TEST_IMG.base 6G

echo
echo "== Some concurrent requests touching the same cluster =="

function overlay_io()
{
    # Start with a request touching two clusters
    echo aio_write -P 0x80 2020k 80k

    # Then add some requests all over the place
    for i in $(seq 0 15; seq 17 31; seq 33 47); do
        echo aio_write -P $((0x81 + i)) $((i * 128))k 64k
    done

    # Then backwards overwriting part of them
    for i in $( (seq 0 15; seq 17 31; seq 33 47) | tac); do
        echo aio_write -P $((0x81 + i)) $((i * 128 + 32))k 64k
    done

    # And finally crossing the next cluster boundary
    echo aio_write -P 0x90 4080k 80k
}

overlay_io | $QEMU_IO $TEST_IMG | _filter_qemu_io |\
	sed -e 's/bytes at offset [0-9]*/bytes at offset XXX/g'

echo
echo "== Verify image content =="

function verify_io()
{
    echo read -P 31 2016k 4k
    echo read -P 0x80 2020k 80k
    echo read -P 32 2100k 12k
    echo read -P 33 2112k 64k

    echo read -P 63 4064k 16k
    echo read -P 0x90 4080k 80k
    echo read -P 65 4160k 64k

    for i in $(seq 0 15; seq 17 31; seq 33 47); do
        echo read -P $((0x81 + i)) $((i * 128))k 96k
    done

    for i in $(seq 0 14; seq 16 30; seq 32 47); do
        local cur_sec=$(( i * 2 + 1 ))
        local pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 ))

        echo read -P $pattern $((i * 128 + 96))k 32k
    done
}

verify_io | $QEMU_IO $TEST_IMG | _filter_qemu_io

_check_test_img

# success, all done
echo "*** done"
rm -f $seq.full
status=0
