1#!/bin/bash 2# 3# Test COW from backing files with AIO 4# 5# Copyright (C) 2012 Red Hat, Inc. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. 19# 20 21# creator 22owner=kwolf@redhat.com 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27here=`pwd` 28tmp=/tmp/$$ 29status=1 # failure is the default! 30 31_cleanup() 32{ 33 _cleanup_test_img 34} 35trap "_cleanup; exit \$status" 0 1 2 3 15 36 37# get standard environment, filters and checks 38. ./common.rc 39. ./common.filter 40 41_supported_fmt qcow2 qed 42_supported_proto file 43_supported_os Linux 44 45CLUSTER_SIZE=2M 46size=128M 47 48echo 49echo "== creating backing file for COW tests ==" 50 51TEST_IMG_SAVE="$TEST_IMG" 52TEST_IMG="$TEST_IMG.base" 53 54_make_test_img $size 55 56function backing_io() 57{ 58 local offset=$1 59 local sectors=$2 60 local op=$3 61 local pattern=0 62 local cur_sec=0 63 64 for i in $(seq 0 $((sectors - 1))); do 65 cur_sec=$((offset / 65536 + i)) 66 pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) 67 68 echo "$op -P $pattern $((cur_sec * 64))k 64k" 69 done 70} 71 72backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io 73 74TEST_IMG="$TEST_IMG_SAVE" 75 76_make_test_img -b "$TEST_IMG.base" 6G 77 78echo 79echo "== Some concurrent requests touching the same cluster ==" 80 81function overlay_io() 82{ 83 # Start with a request touching two clusters 84 echo aio_write -P 0x80 2020k 80k 85 86 # Then add some requests all over the place 87 for i in $(seq 0 15; seq 17 31; seq 33 47); do 88 echo aio_write -P $((0x81 + i)) $((i * 128))k 64k 89 done 90 91 # Then backwards overwriting part of them 92 for i in $( (seq 0 15; seq 17 31; seq 33 47) | tac); do 93 echo aio_write -P $((0x81 + i)) $((i * 128 + 32))k 64k 94 done 95 96 # And finally crossing the next cluster boundary 97 echo aio_write -P 0x90 4080k 80k 98} 99 100overlay_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |\ 101 sed -e 's/bytes at offset [0-9]*/bytes at offset XXX/g' \ 102 -e 's/qemu-io> //g' | paste - - | sort | tr '\t' '\n' 103 104echo 105echo "== Verify image content ==" 106 107function verify_io() 108{ 109 echo read -P 31 2016k 4k 110 echo read -P 0x80 2020k 80k 111 echo read -P 32 2100k 12k 112 echo read -P 33 2112k 64k 113 114 echo read -P 63 4064k 16k 115 echo read -P 0x90 4080k 80k 116 echo read -P 65 4160k 64k 117 118 for i in $(seq 0 15; seq 17 31; seq 33 47); do 119 echo read -P $((0x81 + i)) $((i * 128))k 96k 120 done 121 122 for i in $(seq 0 14; seq 16 30; seq 32 47); do 123 local cur_sec=$(( i * 2 + 1 )) 124 local pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) 125 126 echo read -P $pattern $((i * 128 + 96))k 32k 127 done 128} 129 130verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io 131 132_check_test_img 133 134# success, all done 135echo "*** done" 136rm -f $seq.full 137status=0 138