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` 28status=1 # failure is the default! 29 30_cleanup() 31{ 32 _cleanup_test_img 33} 34trap "_cleanup; exit \$status" 0 1 2 3 15 35 36# get standard environment, filters and checks 37. ./common.rc 38. ./common.filter 39 40_supported_fmt qcow2 qed 41_supported_proto file 42_supported_os Linux 43 44CLUSTER_SIZE=2M 45size=128M 46 47echo 48echo "== creating backing file for COW tests ==" 49 50TEST_IMG_SAVE="$TEST_IMG" 51TEST_IMG="$TEST_IMG.base" 52 53_make_test_img $size 54 55function backing_io() 56{ 57 local offset=$1 58 local sectors=$2 59 local op=$3 60 local pattern=0 61 local cur_sec=0 62 63 for i in $(seq 0 $((sectors - 1))); do 64 cur_sec=$((offset / 65536 + i)) 65 pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) 66 67 echo "$op -P $pattern $((cur_sec * 64))k 64k" 68 done 69} 70 71backing_io 0 256 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io 72 73TEST_IMG="$TEST_IMG_SAVE" 74 75_make_test_img -b "$TEST_IMG.base" 6G 76 77echo 78echo "== Some concurrent requests touching the same cluster ==" 79 80function overlay_io() 81{ 82 # Start with a request touching two clusters 83 echo aio_write -P 0x80 2020k 80k 84 85 # Then add some requests all over the place 86 for i in $(seq 0 15; seq 17 31; seq 33 47); do 87 echo aio_write -P $((0x81 + i)) $((i * 128))k 64k 88 done 89 90 # Then backwards overwriting part of them 91 for i in $( (seq 0 15; seq 17 31; seq 33 47) | tac); do 92 echo aio_write -P $((0x81 + i)) $((i * 128 + 32))k 64k 93 done 94 95 # And finally crossing the next cluster boundary 96 echo aio_write -P 0x90 4080k 80k 97} 98 99overlay_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io |\ 100 sed -e 's/bytes at offset [0-9]*/bytes at offset XXX/g' \ 101 -e 's/qemu-io> //g' | paste - - | sort | tr '\t' '\n' 102 103echo 104echo "== Verify image content ==" 105 106function verify_io() 107{ 108 echo read -P 31 2016k 4k 109 echo read -P 0x80 2020k 80k 110 echo read -P 32 2100k 12k 111 echo read -P 33 2112k 64k 112 113 echo read -P 63 4064k 16k 114 echo read -P 0x90 4080k 80k 115 echo read -P 65 4160k 64k 116 117 for i in $(seq 0 15; seq 17 31; seq 33 47); do 118 echo read -P $((0x81 + i)) $((i * 128))k 96k 119 done 120 121 for i in $(seq 0 14; seq 16 30; seq 32 47); do 122 local cur_sec=$(( i * 2 + 1 )) 123 local pattern=$(( ( (cur_sec % 128) + (cur_sec / 128)) % 128 )) 124 125 echo read -P $pattern $((i * 128 + 96))k 32k 126 done 127} 128 129verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io 130 131_check_test_img 132 133# success, all done 134echo "*** done" 135rm -f $seq.full 136status=0 137