1dc68afe0SStefan Hajnoczi#!/bin/bash 2dc68afe0SStefan Hajnoczi# 3dc68afe0SStefan Hajnoczi# Test qcow2 lazy refcounts 4dc68afe0SStefan Hajnoczi# 5dc68afe0SStefan Hajnoczi# Copyright (C) 2012 Red Hat, Inc. 6dc68afe0SStefan Hajnoczi# Copyright IBM, Corp. 2010 7dc68afe0SStefan Hajnoczi# 8dc68afe0SStefan Hajnoczi# Based on test 038. 9dc68afe0SStefan Hajnoczi# 10dc68afe0SStefan Hajnoczi# This program is free software; you can redistribute it and/or modify 11dc68afe0SStefan Hajnoczi# it under the terms of the GNU General Public License as published by 12dc68afe0SStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or 13dc68afe0SStefan Hajnoczi# (at your option) any later version. 14dc68afe0SStefan Hajnoczi# 15dc68afe0SStefan Hajnoczi# This program is distributed in the hope that it will be useful, 16dc68afe0SStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of 17dc68afe0SStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18dc68afe0SStefan Hajnoczi# GNU General Public License for more details. 19dc68afe0SStefan Hajnoczi# 20dc68afe0SStefan Hajnoczi# You should have received a copy of the GNU General Public License 21dc68afe0SStefan Hajnoczi# along with this program. If not, see <http://www.gnu.org/licenses/>. 22dc68afe0SStefan Hajnoczi# 23dc68afe0SStefan Hajnoczi 24dc68afe0SStefan Hajnoczi# creator 25dc68afe0SStefan Hajnocziowner=stefanha@linux.vnet.ibm.com 26dc68afe0SStefan Hajnoczi 27dc68afe0SStefan Hajnocziseq=`basename $0` 28dc68afe0SStefan Hajnocziecho "QA output created by $seq" 29dc68afe0SStefan Hajnoczi 30dc68afe0SStefan Hajnoczihere=`pwd` 31dc68afe0SStefan Hajnoczitmp=/tmp/$$ 32dc68afe0SStefan Hajnoczistatus=1 # failure is the default! 33dc68afe0SStefan Hajnoczi 34dc68afe0SStefan Hajnoczi_cleanup() 35dc68afe0SStefan Hajnoczi{ 36dc68afe0SStefan Hajnoczi _cleanup_test_img 37dc68afe0SStefan Hajnoczi} 38dc68afe0SStefan Hajnoczitrap "_cleanup; exit \$status" 0 1 2 3 15 39dc68afe0SStefan Hajnoczi 40dc68afe0SStefan Hajnoczi# get standard environment, filters and checks 41dc68afe0SStefan Hajnoczi. ./common.rc 42dc68afe0SStefan Hajnoczi. ./common.filter 43dc68afe0SStefan Hajnoczi 44dc68afe0SStefan Hajnoczi_supported_fmt qcow2 45dc68afe0SStefan Hajnoczi_supported_proto generic 46dc68afe0SStefan Hajnoczi_supported_os Linux 47166f3c7bSStefan Hajnoczi_unsupported_qemu_io_options --nocache 48dc68afe0SStefan Hajnoczi 49dc68afe0SStefan Hajnoczisize=128M 50dc68afe0SStefan Hajnoczi 51dc68afe0SStefan Hajnocziecho 52dc68afe0SStefan Hajnocziecho "== Checking that image is clean on shutdown ==" 53dc68afe0SStefan Hajnoczi 54dc68afe0SStefan HajnocziIMGOPTS="compat=1.1,lazy_refcounts=on" 55dc68afe0SStefan Hajnoczi_make_test_img $size 56dc68afe0SStefan Hajnoczi 57dc68afe0SStefan Hajnoczi$QEMU_IO -c "write -P 0x5a 0 512" $TEST_IMG | _filter_qemu_io 58dc68afe0SStefan Hajnoczi 59dc68afe0SStefan Hajnoczi# The dirty bit must not be set 60dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 61dc68afe0SStefan Hajnoczi_check_test_img 62dc68afe0SStefan Hajnoczi 63dc68afe0SStefan Hajnocziecho 64dc68afe0SStefan Hajnocziecho "== Creating a dirty image file ==" 65dc68afe0SStefan Hajnoczi 66dc68afe0SStefan HajnocziIMGOPTS="compat=1.1,lazy_refcounts=on" 67dc68afe0SStefan Hajnoczi_make_test_img $size 68dc68afe0SStefan Hajnoczi 69dc68afe0SStefan Hajnocziold_ulimit=$(ulimit -c) 70dc68afe0SStefan Hajnocziulimit -c 0 # do not produce a core dump on abort(3) 71dc68afe0SStefan Hajnoczi$QEMU_IO -c "write -P 0x5a 0 512" -c "abort" $TEST_IMG | _filter_qemu_io 72dc68afe0SStefan Hajnocziulimit -c "$old_ulimit" 73dc68afe0SStefan Hajnoczi 74dc68afe0SStefan Hajnoczi# The dirty bit must be set 75dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 76dc68afe0SStefan Hajnoczi_check_test_img 77dc68afe0SStefan Hajnoczi 78dc68afe0SStefan Hajnocziecho 79dc68afe0SStefan Hajnocziecho "== Read-only access must still work ==" 80dc68afe0SStefan Hajnoczi 81dc68afe0SStefan Hajnoczi$QEMU_IO -r -c "read -P 0x5a 0 512" $TEST_IMG | _filter_qemu_io 82dc68afe0SStefan Hajnoczi 83dc68afe0SStefan Hajnoczi# The dirty bit must be set 84dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 85dc68afe0SStefan Hajnoczi 86dc68afe0SStefan Hajnocziecho 87dc68afe0SStefan Hajnocziecho "== Repairing the image file must succeed ==" 88dc68afe0SStefan Hajnoczi 89*c6bb9ad1SFederico Simoncelli_check_test_img -r all 90dc68afe0SStefan Hajnoczi 91dc68afe0SStefan Hajnoczi# The dirty bit must not be set 92dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 93dc68afe0SStefan Hajnoczi 94dc68afe0SStefan Hajnocziecho 95dc68afe0SStefan Hajnocziecho "== Data should still be accessible after repair ==" 96dc68afe0SStefan Hajnoczi 97dc68afe0SStefan Hajnoczi$QEMU_IO -c "read -P 0x5a 0 512" $TEST_IMG | _filter_qemu_io 98dc68afe0SStefan Hajnoczi 99dc68afe0SStefan Hajnocziecho 100dc68afe0SStefan Hajnocziecho "== Opening a dirty image read/write should repair it ==" 101dc68afe0SStefan Hajnoczi 102dc68afe0SStefan HajnocziIMGOPTS="compat=1.1,lazy_refcounts=on" 103dc68afe0SStefan Hajnoczi_make_test_img $size 104dc68afe0SStefan Hajnoczi 105dc68afe0SStefan Hajnocziold_ulimit=$(ulimit -c) 106dc68afe0SStefan Hajnocziulimit -c 0 # do not produce a core dump on abort(3) 107dc68afe0SStefan Hajnoczi$QEMU_IO -c "write -P 0x5a 0 512" -c "abort" $TEST_IMG | _filter_qemu_io 108dc68afe0SStefan Hajnocziulimit -c "$old_ulimit" 109dc68afe0SStefan Hajnoczi 110dc68afe0SStefan Hajnoczi# The dirty bit must be set 111dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 112dc68afe0SStefan Hajnoczi 113dc68afe0SStefan Hajnoczi$QEMU_IO -c "write 0 512" $TEST_IMG | _filter_qemu_io 114dc68afe0SStefan Hajnoczi 115dc68afe0SStefan Hajnoczi# The dirty bit must not be set 116dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 117dc68afe0SStefan Hajnoczi 118dc68afe0SStefan Hajnocziecho 119dc68afe0SStefan Hajnocziecho "== Creating an image file with lazy_refcounts=off ==" 120dc68afe0SStefan Hajnoczi 121dc68afe0SStefan HajnocziIMGOPTS="compat=1.1,lazy_refcounts=off" 122dc68afe0SStefan Hajnoczi_make_test_img $size 123dc68afe0SStefan Hajnoczi 124dc68afe0SStefan Hajnocziold_ulimit=$(ulimit -c) 125dc68afe0SStefan Hajnocziulimit -c 0 # do not produce a core dump on abort(3) 126dc68afe0SStefan Hajnoczi$QEMU_IO -c "write -P 0x5a 0 512" -c "abort" $TEST_IMG | _filter_qemu_io 127dc68afe0SStefan Hajnocziulimit -c "$old_ulimit" 128dc68afe0SStefan Hajnoczi 129dc68afe0SStefan Hajnoczi# The dirty bit must not be set since lazy_refcounts=off 130dc68afe0SStefan Hajnoczi./qcow2.py $TEST_IMG dump-header | grep incompatible_features 131dc68afe0SStefan Hajnoczi_check_test_img 132dc68afe0SStefan Hajnoczi 133dc68afe0SStefan Hajnoczi# success, all done 134dc68afe0SStefan Hajnocziecho "*** done" 135dc68afe0SStefan Hajnoczirm -f $seq.full 136dc68afe0SStefan Hajnoczistatus=0 137dc68afe0SStefan Hajnoczi 138