1#!/bin/bash 2# 3# qcow2 error path testing 4# 5# Copyright (C) 2010 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 rm "$TEST_DIR/blkdebug.conf" 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. ./common.pattern 41 42# Currently only qcow2 supports rebasing 43_supported_fmt qcow2 44_supported_proto file 45_supported_os Linux 46_default_cache_mode "writethrough" 47_supported_cache_modes "writethrough" "none" 48# The refcount table tests expect a certain minimum width for refcount entries 49# (so that the refcount table actually needs to grow); that minimum is 16 bits, 50# being the default refcount entry width. 51# 32 and 64 bits do not work either, however, due to different leaked cluster 52# count on error. 53# Thus, the only remaining option is refcount_bits=16. 54_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' 55 56echo "Errors while writing 128 kB" 57echo 58 59CLUSTER_SIZE=1024 60 61BLKDBG_TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG" 62 63for event in \ 64 l1_update \ 65 \ 66 l2_load \ 67 l2_update \ 68 l2_alloc_write \ 69 \ 70 write_aio \ 71 \ 72 refblock_load \ 73 refblock_update_part \ 74 refblock_alloc \ 75 \ 76 cluster_alloc \ 77 78do 79 80for errno in 5 28; do 81for imm in off; do 82for once in on off; do 83for vmstate in "" "-b"; do 84 85cat > "$TEST_DIR/blkdebug.conf" <<EOF 86[inject-error] 87event = "$event" 88errno = "$errno" 89immediately = "$imm" 90once ="$once" 91EOF 92 93_make_test_img 1G 94 95echo 96echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate" 97 98# We want to catch a simple L2 update, not the allocation of the first L2 table 99if [ "$event" == "l2_update" ]; then 100 $QEMU_IO -c "write $vmstate 0 512" "$TEST_IMG" > /dev/null 2>&1 101fi 102 103$QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 104 105# l2_load is not called on allocation, so issue a second write 106# Reads are another path to trigger l2_load, so do a read, too 107if [ "$event" == "l2_load" ]; then 108 $QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 109 $QEMU_IO -c "read $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 110fi 111 112_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 113 114done 115done 116done 117done 118done 119 120 121echo 122echo === Refcount table growth tests === 123echo 124CLUSTER_SIZE=512 125 126 127for event in \ 128 refblock_alloc_hookup \ 129 refblock_alloc_write \ 130 refblock_alloc_write_blocks \ 131 refblock_alloc_write_table \ 132 refblock_alloc_switch_table \ 133 134do 135 136# This one takes a while, so let's test only one error code (ENOSPC should 137# never be generated by qemu, so it's probably a good choice) 138for errno in 28; do 139for imm in off; do 140for once in on off; do 141for vmstate in "" "-b"; do 142 143cat > "$TEST_DIR/blkdebug.conf" <<EOF 144[inject-error] 145event = "$event" 146errno = "$errno" 147immediately = "$imm" 148once = "$once" 149EOF 150 151_make_test_img 1G 152 153echo 154echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate" 155$QEMU_IO -c "write $vmstate 0 64M" "$BLKDBG_TEST_IMG" | _filter_qemu_io 156 157_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 158 159done 160done 161done 162done 163done 164 165echo 166echo === L1 growth tests === 167echo 168CLUSTER_SIZE=1024 169 170 171for event in \ 172 l1_grow_alloc_table \ 173 l1_grow_write_table \ 174 l1_grow_activate_table \ 175 176do 177 178for errno in 5 28; do 179for imm in off; do 180for once in on off; do 181 182cat > "$TEST_DIR/blkdebug.conf" <<EOF 183[inject-error] 184event = "$event" 185errno = "$errno" 186immediately = "$imm" 187once = "$once" 188EOF 189 190_make_test_img 1G 191 192echo 193echo "Event: $event; errno: $errno; imm: $imm; once: $once" 194$QEMU_IO -c "write -b 0 64k" "$BLKDBG_TEST_IMG" | _filter_qemu_io 195 196_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 197 198done 199done 200done 201done 202 203echo 204echo === Avoid cluster leaks after temporary failure === 205echo 206 207cat > "$TEST_DIR/blkdebug.conf" <<EOF 208[inject-error] 209event = "write_aio" 210errno = "5" 211once = "on" 212EOF 213 214# After the failed first write, do a second write so that the updated refcount 215# block is actually written back 216_make_test_img 64M 217$QEMU_IO -c "write 0 1M" -c "write 0 1M" "$BLKDBG_TEST_IMG" | _filter_qemu_io 218_check_test_img 219 220# success, all done 221echo "*** done" 222rm -f $seq.full 223status=0 224