[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 11/11] [WIP] block: Implement 'blockdev-add' QMP
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [RFC PATCH 11/11] [WIP] block: Implement 'blockdev-add' QMP command |
Date: |
Tue, 9 Jul 2013 11:53:37 +0200 |
This is just a quick hack to test things
Signed-off-by: Kevin Wolf <address@hidden>
---
blockdev.c | 32 ++++++++++++++++++++++++++++++++
qapi-schema.json | 29 +++++++++++++++++++++++++++++
qmp-commands.hx | 6 ++++++
3 files changed, 67 insertions(+)
diff --git a/blockdev.c b/blockdev.c
index e71c4ee..e3a4fb8 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1741,6 +1741,38 @@ void qmp_block_job_complete(const char *device, Error
**errp)
block_job_complete(job, errp);
}
+#include "qapi-visit.h"
+#include "qapi/qmp-output-visitor.h"
+
+void qmp_blockdev_add(BlockOptions *options, Error **errp)
+{
+ QString *str;
+ QmpOutputVisitor *ov = qmp_output_visitor_new();
+ QObject *obj;
+ visit_type_BlockOptions(qmp_output_get_visitor(ov),
+ &options, NULL, errp);
+ obj = qmp_output_get_qobject(ov);
+ str = qobject_to_json_pretty(obj);
+ assert(str != NULL);
+ fprintf(stderr, "\n>>>>>>%s\n<<<<<<\n", qstring_get_str(str));
+ qdict_flatten(obj);
+ str = qobject_to_json_pretty(obj);
+ fprintf(stderr, "\n----->%s\n<-----\n", qstring_get_str(str));
+
+ Error *local_err = NULL;
+ QemuOpts *opts = qemu_opts_from_qdict(&qemu_drive_opts,
qobject_to_qdict(obj), &local_err);
+ if (error_is_set(&local_err)) {
+ qerror_report_err(local_err);
+ error_free(local_err);
+ } else {
+ drive_init(opts, IF_NONE);
+ }
+
+ qobject_decref(obj);
+ qmp_output_visitor_cleanup(ov);
+ QDECREF(str);
+}
+
static void do_qmp_query_block_jobs_one(void *opaque, BlockDriverState *bs)
{
BlockJobInfoList **prev = opaque;
diff --git a/qapi-schema.json b/qapi-schema.json
index a90aeb1..9f1cc8d 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3702,3 +3702,32 @@
'*cpuid-input-ecx': 'int',
'cpuid-register': 'X86CPURegister32',
'features': 'int' } }
+
+
+{ 'type': 'BlockOptionsBase',
+ 'data': { 'driver': 'str', '*read-only': 'bool' } }
+
+{ 'type': 'BlockOptionsFile',
+ 'data': { 'filename': 'str' } }
+
+{ 'type': 'BlockOptionsRaw',
+ 'data': { 'file': 'BlockRef' } }
+
+{ 'type': 'BlockOptionsQcow2',
+ 'data': { '*lazy-refcounts': 'bool', 'file': 'BlockRef' } }
+
+{ 'union': 'BlockOptions',
+ 'base': 'BlockOptionsBase',
+ 'discriminator': 'driver',
+ 'data': {
+ 'file': 'BlockOptionsFile'
+ 'raw': 'BlockOptionsRaw'
+ 'qcow2': 'BlockOptionsQcow2'
+ } }
+
+{ 'union': 'BlockRef',
+ 'discriminator': {},
+ 'data': { 'definition': 'BlockOptions'
+ 'reference': 'str' } }
+
+{ 'command': 'blockdev-add', 'data': { 'options': 'BlockOptions' } }
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 362f0e1..fe32ae7 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3043,3 +3043,9 @@ Example:
<- { "return": {} }
EQMP
+
+ {
+ .name = "blockdev-add",
+ .args_type = "options:q",
+ .mhandler.cmd_new = qmp_marshal_input_blockdev_add,
+ },
--
1.8.1.4
Re: [Qemu-devel] [RFC PATCH 00/11] qapi changes in preparation for blockdev-add, Laszlo Ersek, 2013/07/12