block: Fail gracefully with missing filename
This fixes a regression introduced in commit 2a05cbe42
('block: Allow
block devices without files'):
$ qemu-system-x86_64 -drive driver=file
qemu-system-x86_64: block.c:892: bdrv_open_common: Assertion
`!drv->bdrv_needs_filename || filename != ((void *)0)' failed.
Now the respective check must be performed not only in bdrv_file_open(),
but also in bdrv_open().
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
170632dbc9
commit
765003db02
11
block.c
11
block.c
@ -832,6 +832,12 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
|
||||
filename = qdict_get_try_str(options, "filename");
|
||||
}
|
||||
|
||||
if (drv->bdrv_needs_filename && !filename) {
|
||||
error_setg(errp, "The '%s' block driver requires a file name",
|
||||
drv->format_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name);
|
||||
|
||||
node_name = qdict_get_try_str(options, "node-name");
|
||||
@ -1031,11 +1037,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename,
|
||||
goto fail;
|
||||
}
|
||||
qdict_del(options, "filename");
|
||||
} else if (drv->bdrv_needs_filename && !filename) {
|
||||
error_setg(errp, "The '%s' block driver requires a file name",
|
||||
drv->format_name);
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!drv->bdrv_file_open) {
|
||||
|
@ -171,6 +171,18 @@ echo
|
||||
run_qemu -drive file="$TEST_IMG",file.driver=file
|
||||
run_qemu -drive file="$TEST_IMG",file.driver=qcow2
|
||||
|
||||
echo
|
||||
echo === Leaving out required options ===
|
||||
echo
|
||||
|
||||
run_qemu -drive driver=file
|
||||
run_qemu -drive driver=nbd
|
||||
run_qemu -drive driver=raw
|
||||
run_qemu -drive file.driver=file
|
||||
run_qemu -drive file.driver=nbd
|
||||
run_qemu -drive file.driver=raw
|
||||
run_qemu -drive foo=bar
|
||||
|
||||
echo
|
||||
echo === Parsing protocol from file name ===
|
||||
echo
|
||||
|
@ -225,6 +225,30 @@ Testing: -drive file=TEST_DIR/t.qcow2,file.driver=qcow2
|
||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,file.driver=qcow2: could not open disk image TEST_DIR/t.qcow2: Block format 'qcow2' used by device '' doesn't support the option 'filename'
|
||||
|
||||
|
||||
=== Leaving out required options ===
|
||||
|
||||
Testing: -drive driver=file
|
||||
QEMU_PROG: -drive driver=file: could not open disk image ide0-hd0: The 'file' block driver requires a file name
|
||||
|
||||
Testing: -drive driver=nbd
|
||||
QEMU_PROG: -drive driver=nbd: could not open disk image ide0-hd0: Could not open image: Invalid argument
|
||||
|
||||
Testing: -drive driver=raw
|
||||
QEMU_PROG: -drive driver=raw: could not open disk image ide0-hd0: Can't use 'raw' as a block driver for the protocol level
|
||||
|
||||
Testing: -drive file.driver=file
|
||||
QEMU_PROG: -drive file.driver=file: could not open disk image ide0-hd0: The 'file' block driver requires a file name
|
||||
|
||||
Testing: -drive file.driver=nbd
|
||||
QEMU_PROG: -drive file.driver=nbd: could not open disk image ide0-hd0: Could not open image: Invalid argument
|
||||
|
||||
Testing: -drive file.driver=raw
|
||||
QEMU_PROG: -drive file.driver=raw: could not open disk image ide0-hd0: Can't use 'raw' as a block driver for the protocol level
|
||||
|
||||
Testing: -drive foo=bar
|
||||
QEMU_PROG: -drive foo=bar: could not open disk image ide0-hd0: Must specify either driver or file
|
||||
|
||||
|
||||
=== Parsing protocol from file name ===
|
||||
|
||||
Testing: -hda foo:bar
|
||||
|
Loading…
Reference in New Issue
Block a user