xref: /openbmc/qemu/tests/qemu-iotests/039 (revision 407fb56a)
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