[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/18] block: Allow "driver" option on the top level
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 10/18] block: Allow "driver" option on the top level |
Date: |
Fri, 26 Jul 2013 22:20:24 +0200 |
This is traditionally -drive format=..., which is now translated into
the new driver option. This gives us a more consistent way to select the
driver of BlockDriverStates that can be used in QMP context, too.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
block.c | 7 +++++++
blockdev.c | 20 ++++++++++----------
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/block.c b/block.c
index 6cd39fa..c77cfd1 100644
--- a/block.c
+++ b/block.c
@@ -970,6 +970,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename,
QDict *options,
char tmp_filename[PATH_MAX + 1];
BlockDriverState *file = NULL;
QDict *file_options = NULL;
+ const char *drvname;
/* NULL means an empty set of options */
if (options == NULL) {
@@ -1059,6 +1060,12 @@ int bdrv_open(BlockDriverState *bs, const char
*filename, QDict *options,
}
/* Find the right image format driver */
+ drvname = qdict_get_try_str(options, "driver");
+ if (drvname) {
+ drv = bdrv_find_whitelisted_format(drvname, !(flags & BDRV_O_RDWR));
+ qdict_del(options, "driver");
+ }
+
if (!drv) {
ret = find_image_format(file, filename, &drv);
}
diff --git a/blockdev.c b/blockdev.c
index c5abd65..8ff8ed3 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -322,7 +322,6 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
enum { MEDIA_DISK, MEDIA_CDROM } media;
int bus_id, unit_id;
int cyls, heads, secs, translation;
- BlockDriver *drv = NULL;
int max_devs;
int index;
int ro = 0;
@@ -338,6 +337,7 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
QemuOpts *opts;
QDict *bs_opts;
const char *id;
+ bool has_driver_specific_opts;
translation = BIOS_ATA_TRANSLATION_AUTO;
media = MEDIA_DISK;
@@ -365,6 +365,8 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
qdict_del(bs_opts, "id");
}
+ has_driver_specific_opts = !!qdict_size(bs_opts);
+
/* extract parameters */
bus_id = qemu_opt_get_number(opts, "bus", 0);
unit_id = qemu_opt_get_number(opts, "unit", -1);
@@ -477,11 +479,8 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
error_printf("\n");
return NULL;
}
- drv = bdrv_find_whitelisted_format(buf, ro);
- if (!drv) {
- error_report("'%s' invalid format", buf);
- return NULL;
- }
+
+ qdict_put(bs_opts, "driver", qstring_from_str(buf));
}
/* disk I/O throttling */
@@ -658,7 +657,7 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
abort();
}
if (!file || !*file) {
- if (qdict_size(bs_opts)) {
+ if (has_driver_specific_opts) {
file = NULL;
} else {
return dinfo;
@@ -695,13 +694,13 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
error_report("warning: disabling copy_on_read on readonly drive");
}
- ret = bdrv_open(dinfo->bdrv, file, bs_opts, bdrv_flags, drv);
- bs_opts = NULL;
+ QINCREF(bs_opts);
+ ret = bdrv_open(dinfo->bdrv, file, bs_opts, bdrv_flags, NULL);
if (ret < 0) {
if (ret == -EMEDIUMTYPE) {
error_report("could not open disk image %s: not in %s format",
- file ?: dinfo->id, drv->format_name);
+ file ?: dinfo->id, qdict_get_str(bs_opts, "driver"));
} else {
error_report("could not open disk image %s: %s",
file ?: dinfo->id, strerror(-ret));
@@ -712,6 +711,7 @@ DriveInfo *drive_init(QemuOpts *all_opts,
BlockInterfaceType block_default_type)
if (bdrv_key_required(dinfo->bdrv))
autostart = 0;
+ QDECREF(bs_opts);
qemu_opts_del(opts);
return dinfo;
--
1.8.1.4
- [Qemu-devel] [PULL 00/18] Block patches, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 01/18] qapi-types.py: Implement 'base' for unions, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 02/18] qapi-visit.py: Split off generate_visit_struct_fields(), Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 03/18] qapi-visit.py: Implement 'base' for unions, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 04/18] docs: Document QAPI union types, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 05/18] qapi: Add visitor for implicit structs, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 06/18] qapi: Flat unions with arbitrary discriminator, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 07/18] qapi: Add consume argument to qmp_input_get_object(), Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 08/18] qapi.py: Maintain a list of union types, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 09/18] qapi: Anonymous unions, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 10/18] block: Allow "driver" option on the top level,
Kevin Wolf <=
- [Qemu-devel] [PULL 11/18] QemuOpts: Add qemu_opt_unset(), Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 12/18] blockdev: Rename I/O throttling options for QMP, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 13/18] qcow2: Use dashes instead of underscores in options, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 14/18] blockdev: Rename 'readonly' option to 'read-only', Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 15/18] blockdev: Split up 'cache' option, Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 16/18] Implement qdict_flatten(), Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 17/18] Implement sync modes for drive-backup., Kevin Wolf, 2013/07/26
- [Qemu-devel] [PULL 18/18] Add tests for sync modes 'TOP' and 'NONE', Kevin Wolf, 2013/07/26