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` 28tmp=/tmp/$$ 29status=1 # failure is the default! 30 31_cleanup() 32{ 33 _cleanup_test_img 34 rm "$TEST_DIR/blkdebug.conf" 35} 36trap "_cleanup; exit \$status" 0 1 2 3 15 37 38# get standard environment, filters and checks 39. ./common.rc 40. ./common.filter 41. ./common.pattern 42 43# Currently only qcow2 supports rebasing 44_supported_fmt qcow2 45_supported_proto file 46_supported_os Linux 47_default_cache_mode "writethrough" 48_supported_cache_modes "writethrough" "none" 49 50echo "Errors while writing 128 kB" 51echo 52 53CLUSTER_SIZE=1024 54 55BLKDBG_TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG" 56 57for event in \ 58 l1_update \ 59 \ 60 l2_load \ 61 l2_update \ 62 l2_alloc.write \ 63 \ 64 write_aio \ 65 \ 66 refblock_load \ 67 refblock_update_part \ 68 refblock_alloc \ 69 \ 70 cluster_alloc \ 71 72do 73 74for errno in 5 28; do 75for imm in off; do 76for once in on off; do 77for vmstate in "" "-b"; do 78 79cat > "$TEST_DIR/blkdebug.conf" <<EOF 80[inject-error] 81event = "$event" 82errno = "$errno" 83immediately = "$imm" 84once ="$once" 85EOF 86 87_make_test_img 1G 88 89echo 90echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate" 91 92# We want to catch a simple L2 update, not the allocation of the first L2 table 93if [ "$event" == "l2_update" ]; then 94 $QEMU_IO -c "write $vmstate 0 512" "$TEST_IMG" > /dev/null 2>&1 95fi 96 97$QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 98 99# l2_load is not called on allocation, so issue a second write 100# Reads are another path to trigger l2_load, so do a read, too 101if [ "$event" == "l2_load" ]; then 102 $QEMU_IO -c "write $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 103 $QEMU_IO -c "read $vmstate 0 128k " "$BLKDBG_TEST_IMG" | _filter_qemu_io 104fi 105 106_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 107 108done 109done 110done 111done 112done 113 114 115echo 116echo === Refcout table growth tests === 117echo 118CLUSTER_SIZE=512 119 120 121for event in \ 122 refblock_alloc.hookup \ 123 refblock_alloc.write \ 124 refblock_alloc.write_blocks \ 125 refblock_alloc.write_table \ 126 refblock_alloc.switch_table \ 127 128do 129 130# This one takes a while, so let's test only one error code (ENOSPC should 131# never be generated by qemu, so it's probably a good choice) 132for errno in 28; do 133for imm in off; do 134for once in on off; do 135for vmstate in "" "-b"; do 136 137cat > "$TEST_DIR/blkdebug.conf" <<EOF 138[inject-error] 139event = "$event" 140errno = "$errno" 141immediately = "$imm" 142once = "$once" 143EOF 144 145_make_test_img 1G 146 147echo 148echo "Event: $event; errno: $errno; imm: $imm; once: $once; write $vmstate" 149$QEMU_IO -c "write $vmstate 0 64M" "$BLKDBG_TEST_IMG" | _filter_qemu_io 150 151_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 152 153done 154done 155done 156done 157done 158 159echo 160echo === L1 growth tests === 161echo 162CLUSTER_SIZE=1024 163 164 165for event in \ 166 l1_grow.alloc_table \ 167 l1_grow.write_table \ 168 l1_grow.activate_table \ 169 170do 171 172for errno in 5 28; do 173for imm in off; do 174for once in on off; do 175 176cat > "$TEST_DIR/blkdebug.conf" <<EOF 177[inject-error] 178event = "$event" 179errno = "$errno" 180immediately = "$imm" 181once = "$once" 182EOF 183 184_make_test_img 1G 185 186echo 187echo "Event: $event; errno: $errno; imm: $imm; once: $once" 188$QEMU_IO -c "write -b 0 64k" "$BLKDBG_TEST_IMG" | _filter_qemu_io 189 190_check_test_img 2>&1 | grep -v "refcount=1 reference=0" 191 192done 193done 194done 195done 196 197# success, all done 198echo "*** done" 199rm -f $seq.full 200status=0 201