xref: /openbmc/qemu/tests/qemu-iotests/039 (revision 812b31d3)
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@linux.vnet.ibm.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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
145$PYTHON qcow2.py "$TEST_IMG".base dump-header | 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$PYTHON qcow2.py "$TEST_IMG" 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$PYTHON qcow2.py "$TEST_IMG" 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