xref: /qemu/tests/qemu-iotests/122 (revision 58b3017f)
1#!/bin/bash
2#
3# Test some qemu-img convert cases
4#
5# Copyright (C) 2015 Red Hat, Inc.
6#
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19#
20
21# creator
22owner=kwolf@redhat.com
23
24seq="$(basename $0)"
25echo "QA output created by $seq"
26
27here="$PWD"
28status=1	# failure is the default!
29
30_cleanup()
31{
32    rm -f "$TEST_IMG".[123]
33	_cleanup_test_img
34}
35trap "_cleanup; exit \$status" 0 1 2 3 15
36
37# get standard environment, filters and checks
38. ./common.rc
39. ./common.filter
40
41_supported_fmt qcow2
42_supported_proto file
43_supported_os Linux
44
45
46TEST_IMG="$TEST_IMG".base _make_test_img 64M
47$QEMU_IO -c "write -P 0x11 0 64M" "$TEST_IMG".base 2>&1 | _filter_qemu_io | _filter_testdir
48
49
50echo
51echo "=== Check allocation status regression with -B ==="
52echo
53
54_make_test_img -b "$TEST_IMG".base
55$QEMU_IO -c "write -P 0x22 0 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
56$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base "$TEST_IMG" "$TEST_IMG".orig
57$QEMU_IMG map "$TEST_IMG".orig | _filter_qemu_img_map
58
59
60echo
61echo "=== Check that zero clusters are kept in overlay ==="
62echo
63
64_make_test_img -b "$TEST_IMG".base
65
66$QEMU_IO -c "write -P 0 0 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
67$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base "$TEST_IMG" "$TEST_IMG".orig
68$QEMU_IO -c "read -P 0 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
69$QEMU_IMG convert -O $IMGFMT -c -B "$TEST_IMG".base "$TEST_IMG" "$TEST_IMG".orig
70$QEMU_IO -c "read -P 0 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
71
72$QEMU_IO -c "write -z 0 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
73$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base "$TEST_IMG" "$TEST_IMG".orig
74$QEMU_IO -c "read -P 0 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
75$QEMU_IMG convert -O $IMGFMT -c -B "$TEST_IMG".base "$TEST_IMG" "$TEST_IMG".orig
76$QEMU_IO -c "read -P 0 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
77
78
79echo
80echo "=== Converting to an overlay larger than its backing file ==="
81echo
82
83TEST_IMG="$TEST_IMG".base _make_test_img 256M
84# Needs to be at least how much an L2 table covers
85# (64 kB/entry * 64 kB / 8 B/entry = 512 MB)
86# That way, qcow2 will yield at least two status request responses.
87# With just a single response, it would always say "Allocated in the
88# backing file", so the optimization qemu-img convert tries to do is
89# done automatically.  Once it has to be queried twice, however (and
90# one of the queries is completely after the end of the backing file),
91# the block layer will automatically add a ZERO flag that qemu-img
92# convert used to follow up with a zero write to the target.
93# We do not want such a zero write, however, because we are past the
94# end of the backing file on the target as well, so we do not need to
95# write anything there.
96_make_test_img -b "$TEST_IMG".base 768M
97
98# Use compat=0.10 as the output so there is no zero cluster support
99$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base -o compat=0.10 \
100    "$TEST_IMG" "$TEST_IMG".orig
101# See that nothing has been allocated past 64M
102$QEMU_IMG map "$TEST_IMG".orig | _filter_qemu_img_map
103
104echo
105
106# Just before the end of the backing file
107$QEMU_IO -c 'write -P 0x11 255M 1M' "$TEST_IMG".base 2>&1 | _filter_qemu_io
108# Somewhere in the second L2 table
109$QEMU_IO -c 'write -P 0x22 600M 1M' "$TEST_IMG" 2>&1 | _filter_qemu_io
110
111$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base -o compat=0.10 \
112    "$TEST_IMG" "$TEST_IMG".orig
113
114$QEMU_IMG map "$TEST_IMG".orig | _filter_qemu_img_map
115$QEMU_IO -c 'read -P 0x11 255M 1M' \
116         -c 'read -P 0x22 600M 1M' \
117         "$TEST_IMG".orig \
118    | _filter_qemu_io
119
120
121echo
122echo "=== Concatenate multiple source images ==="
123echo
124
125TEST_IMG="$TEST_IMG".1 _make_test_img 4M
126TEST_IMG="$TEST_IMG".2 _make_test_img 4M
127TEST_IMG="$TEST_IMG".3 _make_test_img 4M
128
129$QEMU_IO -c "write -P 0x11 0 64k" "$TEST_IMG".1 2>&1 | _filter_qemu_io | _filter_testdir
130$QEMU_IO -c "write -P 0x22 0 64k" "$TEST_IMG".2 2>&1 | _filter_qemu_io | _filter_testdir
131$QEMU_IO -c "write -P 0x33 0 64k" "$TEST_IMG".3 2>&1 | _filter_qemu_io | _filter_testdir
132
133$QEMU_IMG convert -O $IMGFMT "$TEST_IMG".[123] "$TEST_IMG"
134$QEMU_IMG map "$TEST_IMG" | _filter_qemu_img_map
135$QEMU_IO -c "read -P 0x11 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
136$QEMU_IO -c "read -P 0x22 4M 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
137$QEMU_IO -c "read -P 0x33 8M 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
138
139$QEMU_IMG convert -c -O $IMGFMT "$TEST_IMG".[123] "$TEST_IMG"
140$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map
141$QEMU_IO -c "read -P 0x11 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
142$QEMU_IO -c "read -P 0x22 4M 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
143$QEMU_IO -c "read -P 0x33 8M 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
144
145# -B can't be combined with concatenation
146$QEMU_IMG convert -O $IMGFMT -B "$TEST_IMG".base "$TEST_IMG".[123] "$TEST_IMG"
147$QEMU_IMG convert -O $IMGFMT -c -B "$TEST_IMG".base "$TEST_IMG".[123] "$TEST_IMG"
148
149
150echo
151echo "=== Compression with misaligned allocations and image sizes ==="
152echo
153
154TEST_IMG="$TEST_IMG".1 _make_test_img 1023k -o cluster_size=1024
155TEST_IMG="$TEST_IMG".2 _make_test_img 1023k -o cluster_size=1024
156
157$QEMU_IO -c "write -P 0x11   16k  16k" "$TEST_IMG".1 2>&1 | _filter_qemu_io | _filter_testdir
158$QEMU_IO -c "write -P 0x22  130k 130k" "$TEST_IMG".1 2>&1 | _filter_qemu_io | _filter_testdir
159$QEMU_IO -c "write -P 0x33 1022k   1k" "$TEST_IMG".1 2>&1 | _filter_qemu_io | _filter_testdir
160$QEMU_IO -c "write -P 0x44    0k   1k" "$TEST_IMG".2 2>&1 | _filter_qemu_io | _filter_testdir
161
162$QEMU_IMG convert -c -O $IMGFMT "$TEST_IMG".[12] "$TEST_IMG"
163$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map
164$QEMU_IO -c "read -P 0       0k   16k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
165$QEMU_IO -c "read -P 0x11   16k   16k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
166$QEMU_IO -c "read -P 0      32k   98k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
167$QEMU_IO -c "read -P 0x22  130k  130k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
168$QEMU_IO -c "read -P 0     260k  762k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
169$QEMU_IO -c "read -P 0x33 1022k    1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
170$QEMU_IO -c "read -P 0x44 1023k    1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
171$QEMU_IO -c "read -P 0    1024k 1022k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
172
173
174echo
175echo "=== Full allocation with -S 0 ==="
176echo
177
178# Standalone image
179_make_test_img 64M
180$QEMU_IO -c "write -P 0x22 0 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
181$QEMU_IO -c "write -P 0 3M 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
182
183echo
184echo convert -S 0:
185$QEMU_IMG convert -O $IMGFMT -S 0 "$TEST_IMG" "$TEST_IMG".orig
186$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
187$QEMU_IO -c "read -P 0 3M 61M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
188$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
189
190echo
191echo convert -c -S 0:
192$QEMU_IMG convert -O $IMGFMT -c -S 0 "$TEST_IMG" "$TEST_IMG".orig
193$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
194$QEMU_IO -c "read -P 0 3M 61M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
195$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
196
197# With backing file
198TEST_IMG="$TEST_IMG".base _make_test_img 64M
199$QEMU_IO -c "write -P 0x11 0 32M" "$TEST_IMG".base 2>&1 | _filter_qemu_io | _filter_testdir
200
201_make_test_img -b "$TEST_IMG".base 64M
202$QEMU_IO -c "write -P 0x22 0 3M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
203
204echo
205echo convert -S 0 with source backing file:
206$QEMU_IMG convert -O $IMGFMT -S 0 "$TEST_IMG" "$TEST_IMG".orig
207$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
208$QEMU_IO -c "read -P 0x11 3M 29M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
209$QEMU_IO -c "read -P 0 32M 32M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
210$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
211
212echo
213echo convert -c -S 0 with source backing file:
214$QEMU_IMG convert -O $IMGFMT -c -S 0 "$TEST_IMG" "$TEST_IMG".orig
215$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
216$QEMU_IO -c "read -P 0x11 3M 29M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
217$QEMU_IO -c "read -P 0 32M 32M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
218$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
219
220# With keeping the backing file
221echo
222echo convert -S 0 -B ...
223$QEMU_IMG convert -O $IMGFMT -S 0 "$TEST_IMG" "$TEST_IMG".orig
224$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
225$QEMU_IO -c "read -P 0x11 3M 29M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
226$QEMU_IO -c "read -P 0 32M 32M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
227$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
228
229echo
230echo convert -c -S 0 -B ...
231$QEMU_IMG convert -O $IMGFMT -c -S 0 "$TEST_IMG" "$TEST_IMG".orig
232$QEMU_IO -c "read -P 0x22 0 3M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
233$QEMU_IO -c "read -P 0x11 3M 29M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
234$QEMU_IO -c "read -P 0 32M 32M" "$TEST_IMG".orig 2>&1 | _filter_qemu_io | _filter_testdir
235$QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
236
237
238echo
239echo "=== Non-zero -S ==="
240echo
241
242_make_test_img 64M -o cluster_size=1k
243$QEMU_IO -c "write -P 0 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
244$QEMU_IO -c "write 0 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
245$QEMU_IO -c "write 8k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
246$QEMU_IO -c "write 17k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
247
248for min_sparse in 4k 8k; do
249    echo
250    echo convert -S $min_sparse
251    $QEMU_IMG convert -O $IMGFMT -o cluster_size=1k -S $min_sparse "$TEST_IMG" "$TEST_IMG".orig
252    $QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
253
254    echo
255    echo convert -c -S $min_sparse
256    # For compressed images, -S values other than 0 are ignored
257    $QEMU_IMG convert -O $IMGFMT -o cluster_size=1k -c -S $min_sparse "$TEST_IMG" "$TEST_IMG".orig
258    $QEMU_IMG map --output=json "$TEST_IMG".orig | _filter_qemu_img_map
259done
260
261# success, all done
262echo '*** done'
263rm -f $seq.full
264status=0
265