block: Allow block devices without files
blkdebug and blkverify will, in order to retain compatibility, not support the field "file" implicitly through bdrv_open(). In order to be able to use those drivers without giving a filename anyway, it is necessary to be able to have block devices without files implicitly opened by bdrv_open(). This is the case, if there was neither a file name, a reference to an existing block device to use as a file nor options specific to the file. Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2258e3fe20
commit
2a05cbe426
23
block.c
23
block.c
@ -1145,11 +1145,14 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
qdict_extract_subqdict(options, &file_options, "file.");
|
||||
file_reference = qdict_get_try_str(options, "file");
|
||||
|
||||
ret = bdrv_file_open(&file, filename, file_reference, file_options,
|
||||
bdrv_open_flags(bs, flags | BDRV_O_UNMAP), &local_err);
|
||||
qdict_del(options, "file");
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
if (filename || file_reference || qdict_size(file_options)) {
|
||||
ret = bdrv_file_open(&file, filename, file_reference, file_options,
|
||||
bdrv_open_flags(bs, flags | BDRV_O_UNMAP),
|
||||
&local_err);
|
||||
qdict_del(options, "file");
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
/* Find the right image format driver */
|
||||
@ -1165,7 +1168,13 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
}
|
||||
|
||||
if (!drv) {
|
||||
ret = find_image_format(file, filename, &drv, &local_err);
|
||||
if (file) {
|
||||
ret = find_image_format(file, filename, &drv, &local_err);
|
||||
} else {
|
||||
error_setg(errp, "Must specify either driver or file");
|
||||
ret = -EINVAL;
|
||||
goto unlink_and_fail;
|
||||
}
|
||||
}
|
||||
|
||||
if (!drv) {
|
||||
@ -1178,7 +1187,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
goto unlink_and_fail;
|
||||
}
|
||||
|
||||
if (bs->file != file) {
|
||||
if (file && (bs->file != file)) {
|
||||
bdrv_unref(file);
|
||||
file = NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user