1#!/usr/bin/env bash 2# group: rw auto quick 3# 4# Test qcow2 lazy refcounts 5# 6# Copyright (C) 2012 Red Hat, Inc. 7# Copyright IBM, Corp. 2010 8# 9# Based on test 038. 10# 11# This program is free software; you can redistribute it and/or modify 12# it under the terms of the GNU General Public License as published by 13# the Free Software Foundation; either version 2 of the License, or 14# (at your option) any later version. 15# 16# This program is distributed in the hope that it will be useful, 17# but WITHOUT ANY WARRANTY; without even the implied warranty of 18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19# GNU General Public License for more details. 20# 21# You should have received a copy of the GNU General Public License 22# along with this program. If not, see <http://www.gnu.org/licenses/>. 23# 24 25# creator 26owner=stefanha@redhat.com 27 28seq=`basename $0` 29echo "QA output created by $seq" 30 31status=1 # failure is the default! 32 33_cleanup() 34{ 35 _cleanup_test_img 36} 37trap "_cleanup; exit \$status" 0 1 2 3 15 38 39# get standard environment, filters and checks 40. ./common.rc 41. ./common.filter 42 43_supported_fmt qcow2 44_supported_proto file fuse 45_supported_os Linux 46_default_cache_mode writethrough 47_supported_cache_modes writethrough 48# Some of these test cases expect no external data file so that all 49# clusters are part of the qcow2 image and refcounted 50_unsupported_imgopts data_file 51 52size=128M 53 54echo 55echo "== Checking that image is clean on shutdown ==" 56 57_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 58 59$QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 60 61# The dirty bit must not be set 62_qcow2_dump_header | grep incompatible_features 63_check_test_img 64 65echo 66echo "== Creating a dirty image file ==" 67 68_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 69 70_NO_VALGRIND \ 71$QEMU_IO -c "write -P 0x5a 0 512" \ 72 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 73 | _filter_qemu_io 74 75# The dirty bit must be set 76_qcow2_dump_header | grep incompatible_features 77_check_test_img 78 79echo 80echo "== Read-only access must still work ==" 81 82$QEMU_IO -r -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 83 84# The dirty bit must be set 85_qcow2_dump_header | grep incompatible_features 86 87echo 88echo "== Repairing the image file must succeed ==" 89 90_check_test_img -r all 91 92# The dirty bit must not be set 93_qcow2_dump_header | grep incompatible_features 94 95echo 96echo "== Data should still be accessible after repair ==" 97 98$QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 99 100echo 101echo "== Opening a dirty image read/write should repair it ==" 102 103_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 104 105_NO_VALGRIND \ 106$QEMU_IO -c "write -P 0x5a 0 512" \ 107 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 108 | _filter_qemu_io 109 110# The dirty bit must be set 111_qcow2_dump_header | grep incompatible_features 112 113$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 114 115# The dirty bit must not be set 116_qcow2_dump_header | grep incompatible_features 117 118echo 119echo "== Creating an image file with lazy_refcounts=off ==" 120 121_make_test_img -o "compat=1.1,lazy_refcounts=off" $size 122 123_NO_VALGRIND \ 124$QEMU_IO -c "write -P 0x5a 0 512" \ 125 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 126 | _filter_qemu_io 127 128# The dirty bit must not be set since lazy_refcounts=off 129_qcow2_dump_header | grep incompatible_features 130_check_test_img 131 132echo 133echo "== Committing to a backing file with lazy_refcounts=on ==" 134 135TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 136 137_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" \ 138 -F $IMGFMT $size 139 140$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 141$QEMU_IMG commit "$TEST_IMG" 142 143# The dirty bit must not be set 144_qcow2_dump_header | grep incompatible_features 145_qcow2_dump_header "$TEST_IMG".base | grep incompatible_features 146 147_check_test_img 148TEST_IMG="$TEST_IMG".base _check_test_img 149 150echo 151echo "== Changing lazy_refcounts setting at runtime ==" 152 153_make_test_img -o "compat=1.1,lazy_refcounts=off" $size 154 155_NO_VALGRIND \ 156$QEMU_IO -c "reopen -o lazy-refcounts=on" \ 157 -c "write -P 0x5a 0 512" \ 158 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 159 | _filter_qemu_io 160 161# The dirty bit must be set 162_qcow2_dump_header | grep incompatible_features 163_check_test_img 164 165_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 166 167_NO_VALGRIND \ 168$QEMU_IO -c "reopen -o lazy-refcounts=off" \ 169 -c "write -P 0x5a 0 512" \ 170 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 171 | _filter_qemu_io 172 173# The dirty bit must not be set 174_qcow2_dump_header | grep incompatible_features 175_check_test_img 176 177 178# success, all done 179echo "*** done" 180rm -f $seq.full 181status=0 182 183