qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]