#!/bin/bash
#
# When using a backing file for the output image in qemu-img convert,
# the backing file clusters must not copied. The data must still be
# read correctly.
#
# Copyright (C) 2009 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"

status=1	# failure is the default!

_cleanup()
{
	_cleanup_test_img
    rm -f "$TEST_IMG.base"
    rm -f "$TEST_IMG.orig"
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

# Any format supporting backing files
_supported_fmt qcow qcow2 vmdk qed
_supported_proto file
_supported_os Linux
_unsupported_imgopts "subformat=monolithicFlat" \
                     "subformat=twoGbMaxExtentFlat" \
                     "subformat=twoGbMaxExtentSparse"

TEST_OFFSETS="0 4294967296"
CLUSTER_SIZE=65536

TEST_IMG_SAVE="$TEST_IMG"
TEST_IMG="$TEST_IMG.base"

_make_test_img 6G

echo "Filling base image"
echo

for offset in $TEST_OFFSETS; do
    # Some clusters with alternating backing file/image file reads
    io_pattern writev $(( offset )) 512 1024 64 42

    # Complete backing clusters
    io_pattern writev $(( offset  + 1024 * 1024))  $CLUSTER_SIZE $CLUSTER_SIZE 1 42
done
_check_test_img

echo "Creating test image with backing file"
echo

TEST_IMG="$TEST_IMG_SAVE.orig"
_make_test_img -b "$TEST_IMG_SAVE.base" 6G

echo "Filling test image"
echo

for offset in $TEST_OFFSETS; do
    # Some clusters with alternating backing file/image file reads
    io_pattern writev $(( offset + 512 )) 512 1024 64 43

    # Complete test image clusters
    io_pattern writev $(( offset + 1024 * 1024 + $CLUSTER_SIZE))  $CLUSTER_SIZE $CLUSTER_SIZE 1 43
done
_check_test_img

TEST_IMG="$TEST_IMG_SAVE"

# Test the conversion twice: One test with the old-style -B option and another
# one with -o backing_file

for backing_option in "-B " "-o backing_file="; do

    echo
    echo Testing conversion with $backing_option"$TEST_IMG.base" | _filter_testdir | _filter_imgfmt
    echo
    $QEMU_IMG convert -f $IMGFMT -O $IMGFMT $backing_option"$TEST_IMG.base" "$TEST_IMG.orig" "$TEST_IMG"

    echo "Checking if backing clusters are allocated when they shouldn't"
    echo
    for offset in $TEST_OFFSETS; do
        # Complete backing clusters
        is_allocated $(( offset  + 1024 * 1024))  $CLUSTER_SIZE $CLUSTER_SIZE 1
    done

    echo "Reading"
    echo

    for offset in $TEST_OFFSETS; do
        # Some clusters with alternating backing file/image file reads
        io_pattern readv $(( offset )) 512 1024 64 42
        io_pattern readv $(( offset + 512 )) 512 1024 64 43

        # Complete test image clusters
        io_pattern readv $(( offset  + 1024 * 1024))  $CLUSTER_SIZE $CLUSTER_SIZE 1 42
        io_pattern readv $(( offset + 1024 * 1024 + $CLUSTER_SIZE))  $CLUSTER_SIZE $CLUSTER_SIZE 1 43

        # Empty sectors
        io_zero readv $(( offset + 1024 * 1024 + $CLUSTER_SIZE * 4 )) $CLUSTER_SIZE $CLUSTER_SIZE 1
    done
    _check_test_img

done

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