111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env 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 Hajnoczistatus=1 # failure is the default! 31dc68afe0SStefan Hajnoczi 32dc68afe0SStefan Hajnoczi_cleanup() 33dc68afe0SStefan Hajnoczi{ 34dc68afe0SStefan Hajnoczi _cleanup_test_img 35dc68afe0SStefan Hajnoczi} 36dc68afe0SStefan Hajnoczitrap "_cleanup; exit \$status" 0 1 2 3 15 37dc68afe0SStefan Hajnoczi 38dc68afe0SStefan Hajnoczi# get standard environment, filters and checks 39dc68afe0SStefan Hajnoczi. ./common.rc 40dc68afe0SStefan Hajnoczi. ./common.filter 41dc68afe0SStefan Hajnoczi 42dc68afe0SStefan Hajnoczi_supported_fmt qcow2 431f7bf7d0SPeter Lieven_supported_proto file 44dc68afe0SStefan Hajnoczi_supported_os Linux 45755c5fe7SNir Soffer_default_cache_mode writethrough 46755c5fe7SNir Soffer_supported_cache_modes writethrough 47dc68afe0SStefan Hajnoczi 48dc68afe0SStefan Hajnoczisize=128M 49dc68afe0SStefan Hajnoczi 50dc68afe0SStefan Hajnocziecho 51dc68afe0SStefan Hajnocziecho "== Checking that image is clean on shutdown ==" 52dc68afe0SStefan Hajnoczi 53*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 54dc68afe0SStefan Hajnoczi 55f897e393SJeff Cody$QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 56dc68afe0SStefan Hajnoczi 57dc68afe0SStefan Hajnoczi# The dirty bit must not be set 58ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 59dc68afe0SStefan Hajnoczi_check_test_img 60dc68afe0SStefan Hajnoczi 61dc68afe0SStefan Hajnocziecho 62dc68afe0SStefan Hajnocziecho "== Creating a dirty image file ==" 63dc68afe0SStefan Hajnoczi 64*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 65dc68afe0SStefan Hajnoczi 668af224d6SAndrey Shinkevich_NO_VALGRIND \ 67934659c4SMax Reitz$QEMU_IO -c "write -P 0x5a 0 512" \ 683f394472SMax Reitz -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 693f394472SMax Reitz | _filter_qemu_io 70dc68afe0SStefan Hajnoczi 71dc68afe0SStefan Hajnoczi# The dirty bit must be set 72ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 73dc68afe0SStefan Hajnoczi_check_test_img 74dc68afe0SStefan Hajnoczi 75dc68afe0SStefan Hajnocziecho 76dc68afe0SStefan Hajnocziecho "== Read-only access must still work ==" 77dc68afe0SStefan Hajnoczi 78fef9c191SJeff Cody$QEMU_IO -r -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 79dc68afe0SStefan Hajnoczi 80dc68afe0SStefan Hajnoczi# The dirty bit must be set 81ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 82dc68afe0SStefan Hajnoczi 83dc68afe0SStefan Hajnocziecho 84dc68afe0SStefan Hajnocziecho "== Repairing the image file must succeed ==" 85dc68afe0SStefan Hajnoczi 86c6bb9ad1SFederico Simoncelli_check_test_img -r all 87dc68afe0SStefan Hajnoczi 88dc68afe0SStefan Hajnoczi# The dirty bit must not be set 89ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 90dc68afe0SStefan Hajnoczi 91dc68afe0SStefan Hajnocziecho 92dc68afe0SStefan Hajnocziecho "== Data should still be accessible after repair ==" 93dc68afe0SStefan Hajnoczi 94fef9c191SJeff Cody$QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 95dc68afe0SStefan Hajnoczi 96dc68afe0SStefan Hajnocziecho 97dc68afe0SStefan Hajnocziecho "== Opening a dirty image read/write should repair it ==" 98dc68afe0SStefan Hajnoczi 99*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 100dc68afe0SStefan Hajnoczi 1018af224d6SAndrey Shinkevich_NO_VALGRIND \ 102934659c4SMax Reitz$QEMU_IO -c "write -P 0x5a 0 512" \ 1033f394472SMax Reitz -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 1043f394472SMax Reitz | _filter_qemu_io 105dc68afe0SStefan Hajnoczi 106dc68afe0SStefan Hajnoczi# The dirty bit must be set 107ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 108dc68afe0SStefan Hajnoczi 109fef9c191SJeff Cody$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 110dc68afe0SStefan Hajnoczi 111dc68afe0SStefan Hajnoczi# The dirty bit must not be set 112ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 113dc68afe0SStefan Hajnoczi 114dc68afe0SStefan Hajnocziecho 115dc68afe0SStefan Hajnocziecho "== Creating an image file with lazy_refcounts=off ==" 116dc68afe0SStefan Hajnoczi 117*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=off" $size 118dc68afe0SStefan Hajnoczi 1198af224d6SAndrey Shinkevich_NO_VALGRIND \ 120934659c4SMax Reitz$QEMU_IO -c "write -P 0x5a 0 512" \ 1213f394472SMax Reitz -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 1223f394472SMax Reitz | _filter_qemu_io 123dc68afe0SStefan Hajnoczi 124dc68afe0SStefan Hajnoczi# The dirty bit must not be set since lazy_refcounts=off 125ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 126dc68afe0SStefan Hajnoczi_check_test_img 127dc68afe0SStefan Hajnoczi 1284c2e5f8fSKevin Wolfecho 1294c2e5f8fSKevin Wolfecho "== Committing to a backing file with lazy_refcounts=on ==" 1304c2e5f8fSKevin Wolf 131*407fb56aSMax ReitzTEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 1324c2e5f8fSKevin Wolf 133*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" $size 1344c2e5f8fSKevin Wolf 1354c2e5f8fSKevin Wolf$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 1364c2e5f8fSKevin Wolf$QEMU_IMG commit "$TEST_IMG" 1374c2e5f8fSKevin Wolf 1384c2e5f8fSKevin Wolf# The dirty bit must not be set 139ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 140ea81ca9dSMax Reitz$PYTHON qcow2.py "$TEST_IMG".base dump-header | grep incompatible_features 1414c2e5f8fSKevin Wolf 1424c2e5f8fSKevin Wolf_check_test_img 1434c2e5f8fSKevin WolfTEST_IMG="$TEST_IMG".base _check_test_img 1444c2e5f8fSKevin Wolf 145e615053bSKevin Wolfecho 146e615053bSKevin Wolfecho "== Changing lazy_refcounts setting at runtime ==" 147e615053bSKevin Wolf 148*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=off" $size 149e615053bSKevin Wolf 1508af224d6SAndrey Shinkevich_NO_VALGRIND \ 151e615053bSKevin Wolf$QEMU_IO -c "reopen -o lazy-refcounts=on" \ 152e615053bSKevin Wolf -c "write -P 0x5a 0 512" \ 153e615053bSKevin Wolf -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 154e615053bSKevin Wolf | _filter_qemu_io 155e615053bSKevin Wolf 156e615053bSKevin Wolf# The dirty bit must be set 157e615053bSKevin Wolf$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 158e615053bSKevin Wolf_check_test_img 159e615053bSKevin Wolf 160*407fb56aSMax Reitz_make_test_img -o "compat=1.1,lazy_refcounts=on" $size 161e615053bSKevin Wolf 1628af224d6SAndrey Shinkevich_NO_VALGRIND \ 163e615053bSKevin Wolf$QEMU_IO -c "reopen -o lazy-refcounts=off" \ 164e615053bSKevin Wolf -c "write -P 0x5a 0 512" \ 165e615053bSKevin Wolf -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 166e615053bSKevin Wolf | _filter_qemu_io 167e615053bSKevin Wolf 168e615053bSKevin Wolf# The dirty bit must not be set 169e615053bSKevin Wolf$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features 170e615053bSKevin Wolf_check_test_img 171e615053bSKevin Wolf 1724c2e5f8fSKevin Wolf 173dc68afe0SStefan Hajnoczi# success, all done 174dc68afe0SStefan Hajnocziecho "*** done" 175dc68afe0SStefan Hajnoczirm -f $seq.full 176dc68afe0SStefan Hajnoczistatus=0 177dc68afe0SStefan Hajnoczi 178