Skip to content

Commit 5f0681e

Browse files
kevmwmdroth
authored andcommitted
block: Don't probe for unknown backing file format
If a qcow2 image specifies a backing file format that doesn't correspond to any format driver that qemu knows, we shouldn't fall back to probing, but simply error out. Not looking up the backing file driver in bdrv_open_backing_file(), but just filling in the "driver" option if it isn't there moves us closer to the goal of having everything in QDict options and gets us the error handling of bdrv_open(), which correctly refuses unknown drivers. Cc: [email protected] Signed-off-by: Kevin Wolf <[email protected]> Reviewed-by: Max Reitz <[email protected]> Message-id: [email protected] Signed-off-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Kevin Wolf <[email protected]> (cherry picked from commit c5f6e49) Conflicts: tests/qemu-iotests/group *removed context from upstream iotest groups Signed-off-by: Michael Roth <[email protected]>
1 parent 75eb0f5 commit 5f0681e

File tree

4 files changed

+78
-4
lines changed

4 files changed

+78
-4
lines changed

block.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,6 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
11771177
{
11781178
char *backing_filename = g_malloc0(PATH_MAX);
11791179
int ret = 0;
1180-
BlockDriver *back_drv = NULL;
11811180
BlockDriverState *backing_hd;
11821181
Error *local_err = NULL;
11831182

@@ -1210,14 +1209,14 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
12101209

12111210
backing_hd = bdrv_new("", errp);
12121211

1213-
if (bs->backing_format[0] != '\0') {
1214-
back_drv = bdrv_find_format(bs->backing_format);
1212+
if (bs->backing_format[0] != '\0' && !qdict_haskey(options, "driver")) {
1213+
qdict_put(options, "driver", qstring_from_str(bs->backing_format));
12151214
}
12161215

12171216
assert(bs->backing_hd == NULL);
12181217
ret = bdrv_open(&backing_hd,
12191218
*backing_filename ? backing_filename : NULL, NULL, options,
1220-
bdrv_backing_flags(bs->open_flags), back_drv, &local_err);
1219+
bdrv_backing_flags(bs->open_flags), NULL, &local_err);
12211220
if (ret < 0) {
12221221
bdrv_unref(backing_hd);
12231222
backing_hd = NULL;

tests/qemu-iotests/114

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
#
3+
# Test invalid backing file format in qcow2 images
4+
#
5+
# Copyright (C) 2014 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
22+
23+
24+
seq="$(basename $0)"
25+
echo "QA output created by $seq"
26+
27+
here="$PWD"
28+
tmp=/tmp/$$
29+
status=1 # failure is the default!
30+
31+
_cleanup()
32+
{
33+
_cleanup_test_img
34+
}
35+
trap "_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 generic
43+
_supported_os Linux
44+
45+
46+
TEST_IMG="$TEST_IMG.base" _make_test_img 64M
47+
_make_test_img -b "$TEST_IMG.base" 64M
48+
49+
# Set an invalid backing file format
50+
$PYTHON qcow2.py "$TEST_IMG" add-header-ext 0xE2792ACA "foo"
51+
_img_info
52+
53+
# Try opening the image. Should fail (and not probe) in the first case, but
54+
# overriding the backing file format should be possible.
55+
$QEMU_IO -c "open $TEST_IMG" -c "read 0 4k" 2>&1 | _filter_qemu_io | _filter_testdir
56+
$QEMU_IO -c "open -o backing.driver=$IMGFMT $TEST_IMG" -c "read 0 4k" | _filter_qemu_io
57+
58+
# success, all done
59+
echo '*** done'
60+
rm -f $seq.full
61+
status=0

tests/qemu-iotests/114.out

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
QA output created by 114
2+
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
3+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file='TEST_DIR/t.IMGFMT.base'
4+
image: TEST_DIR/t.IMGFMT
5+
file format: IMGFMT
6+
virtual size: 64M (67108864 bytes)
7+
cluster_size: 65536
8+
backing file: TEST_DIR/t.IMGFMT.base
9+
backing file format: foo
10+
qemu-io: can't open device TEST_DIR/t.qcow2: Could not open backing file: Unknown driver 'foo'
11+
read 4096/4096 bytes at offset 0
12+
4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
13+
*** done

tests/qemu-iotests/group

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,4 @@
102102
095 rw auto quick
103103
101 rw auto quick
104104
113 rw auto quick
105+
114 rw auto quick

0 commit comments

Comments
 (0)