#!/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 . # # 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 file _supported_os Linux CLUSTER_SIZE=2M size=128M echo echo "== creating backing file for COW tests ==" TEST_IMG_SAVE="$TEST_IMG" TEST_IMG="$TEST_IMG.base" _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 TEST_IMG="$TEST_IMG_SAVE" _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' \ -e 's/qemu-io> //g' | paste - - | sort | tr '\t' '\n' 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