block: Error if backing file fails during creation without -u

Back in commit 6e6e55f5 (Jul 2017, v2.10), we tweaked the code to warn
if the backing file could not be opened but the user gave a size,
unless the user also passes the -u option to bypass the open of the
backing file.  As one common reason for failure to open the backing
file is when there is mismatch in the requested backing format in
relation to what the backing file actually contains, we actually want
to open the backing file and ensure that it has the right format in as
many cases as possible.  iotest 301 for qcow demonstrates how
detecting explicit format mismatch is useful to prevent the creation
of an image that would probe differently than the user requested.  Now
is the time to finally turn the warning an error, as promised.

Note that the original warning was added prior to our documentation of
an official deprecation policy (eb22aeca, also Jul 2017), and because
the warning didn't mention the word "deprecated", we never actually
remembered to document it as such.  But the warning has been around
long enough that I don't see prolonging it another two releases.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200706203954.341758-7-eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Eric Blake 2020-07-06 15:39:50 -05:00 committed by Kevin Wolf
parent 344acbd62f
commit add8200dd1
4 changed files with 20 additions and 19 deletions

12
block.c
View file

@ -6128,16 +6128,8 @@ void bdrv_img_create(const char *filename, const char *fmt,
bs = bdrv_open(full_backing, NULL, backing_options, back_flags,
&local_err);
g_free(full_backing);
if (!bs && size != -1) {
/* Couldn't open BS, but we have a size, so it's nonfatal */
warn_reportf_err(local_err,
"Could not verify backing image. "
"This may become an error in future versions.\n");
local_err = NULL;
} else if (!bs) {
/* Couldn't open bs, do not have size */
error_append_hint(&local_err,
"Could not open backing image to determine size.\n");
if (!bs) {
error_append_hint(&local_err, "Could not open backing image.\n");
goto out;
} else {
if (size == -1) {

View file

@ -555,6 +555,18 @@ can be rewritten as::
All options specified in ``-o`` are image creation options, so
they are now rejected when used with ``-n`` to skip image creation.
``qemu-img create -b bad file $size`` (removed in 5.1)
''''''''''''''''''''''''''''''''''''''''''''''''''''''
When creating an image with a backing file that could not be opened,
``qemu-img create`` used to issue a warning about the failure but
proceed with the image creation if an explicit size was provided.
However, as the ``-u`` option exists for this purpose, it is safer to
enforce that any failure to open the backing image (including if the
backing file is missing or an incorrect format was specified) is an
error when ``-u`` is not used.
Command line options
--------------------

View file

@ -1,4 +1,4 @@
QA output created by 111
qemu-img: TEST_DIR/t.IMGFMT: Could not open 'TEST_DIR/t.IMGFMT.inexistent': No such file or directory
Could not open backing image to determine size.
Could not open backing image.
*** done

View file

@ -17,18 +17,15 @@ backing file: TEST_DIR/t.IMGFMT.base
== mismatched command line detection ==
qemu-img: TEST_DIR/t.IMGFMT: invalid VMDK image descriptor
Could not open backing image to determine size.
qemu-img: warning: Could not verify backing image. This may become an error in future versions.
invalid VMDK image descriptor
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=vmdk
Could not open backing image.
qemu-img: TEST_DIR/t.IMGFMT: invalid VMDK image descriptor
Could not open backing image.
qemu-img: TEST_DIR/t.IMGFMT: Image creation needs a size parameter
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=vmdk
qemu-img: warning: Could not verify backing image. This may become an error in future versions.
Unknown driver 'garbage'
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=garbage
qemu-img: TEST_DIR/t.IMGFMT: unrecognized backing format 'garbage'
qemu-img: TEST_DIR/t.IMGFMT: Unknown driver 'garbage'
Could not open backing image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=garbage
qemu-img: TEST_DIR/t.IMGFMT: unrecognized backing format 'garbage'
image: TEST_DIR/t.IMGFMT