@@ -2270,10 +2270,13 @@ void qmp_block_job_complete(const char *device, Error **errp)
void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
{
QmpOutputVisitor *ov = qmp_output_visitor_new();
+ QemuOptsList *list = qemu_find_opts("drive");
+ const char *id = options->id;
DriveInfo *dinfo;
QObject *obj;
QDict *qdict;
Error *local_err = NULL;
+ QemuOpts *opts = NULL;
/* Require an ID in the top level */
if (!options->has_id) {
@@ -2281,6 +2284,19 @@ void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
goto fail;
}
+ /*
+ * Check the ID is duplicate ID or not.
+ * If not, insert this blockdev into QemuOptsList.
+ */
+ opts = qemu_opts_create(list, id, 1, &local_err);
+ if (opts == NULL) {
+ if (local_err) {
+ qerror_report_err(local_err);
+ error_free(local_err);
+ }
+ goto fail;
+ }
+
/* TODO Sort it out in raw-posix and drive_init: Reject aio=native with
* cache.direct=false instead of silently switching to aio=threads, except
* if called from drive_init.
Currently, when using blockdev-add to add a drive, qemu can not insert this new drive to QemuOptsList. So this will cause the bug: https://bugzilla.redhat.com/show_bug.cgi?id=1088176 This patch check the ID is duplicate or not firstly, then if not, insert the new drive with this ID to QemuOptsList. Signed-off-by: Jun Li <junmuzi@gmail.com> --- blockdev.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)