Blame SOURCES/0012-QMP-Forward-port-__com.redhat_drive_add-from-RHEL-6.patch

357786
From f8f33512aefd597c9664eeb26a97cafc12d958da Mon Sep 17 00:00:00 2001
9bac43
From: Markus Armbruster <armbru@redhat.com>
9bac43
Date: Tue, 14 Mar 2017 14:16:45 +0100
9bac43
Subject: QMP: Forward-port __com.redhat_drive_add from RHEL-6
9bac43
9bac43
RH-Author: Markus Armbruster <armbru@redhat.com>
9bac43
Message-id: <1387262799-10350-4-git-send-email-armbru@redhat.com>
9bac43
Patchwork-id: 56294
9bac43
O-Subject: [PATCH v2 3/6] QMP: Forward-port __com.redhat_drive_add from RHEL-6
9bac43
Bugzilla: 889051
9bac43
RH-Acked-by: Fam Zheng <famz@redhat.com>
9bac43
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
RH-Acked-by: Luiz Capitulino <lcapitulino@redhat.com>
9bac43
9bac43
From: Markus Armbruster <armbru@redhat.com>
9bac43
9bac43
Code taken from RHEL-6 as of qemu-kvm-0.12.1.2-2.418.el6, backported
9bac43
and fixed up as follows:
9bac43
9bac43
* Update simple_drive_add() for commit 4e89978 "qemu-option:
9bac43
  qemu_opts_from_qdict(): use error_set()".
9bac43
9bac43
* Update simple_drive_add() for commit 2d0d283 "Support default block
9bac43
  interfaces per QEMUMachine".
9bac43
9bac43
* Add comment explaining drive_init() error reporting hacks to
9bac43
  simple_drive_add().
9bac43
9bac43
* qemu-monitor.hx has been split into qmp-commands.hx and
9bac43
  hmp-commands.hx.  Copy the QMP parts to qmp-commands.hx.  Clean up
9bac43
  second example slightly.
9bac43
9bac43
* Trailing whitespace cleaned up.
9bac43
9bac43
Signed-off-by: Markus Armbruster <armbru@redhat.com>
9bac43
9bac43
Rebase notes (2.9.0):
9bac43
- documentation moved from docs/qmp-commands.txt to qapi/block.json
9bac43
- added argument to qmp_register_command
9bac43
- explicit argument listing for correct documentation checking
9bac43
9bac43
Rebase notes (2.8.0):
9bac43
- qmp-commands.hx replaced by docs/qmp-commands.txt (commit bd6092e)
9bac43
9bac43
Rebase notes (2.6.0):
9bac43
- Added qapi/error.h to device-hotplug.c
9bac43
9bac43
Rebase notes (2.4.0):
9bac43
- removed qerror_report
9bac43
- removed user_print
9bac43
9bac43
Merged patches (2.9.0):
9bac43
- 599ec5f QMP: Fix forward port of __com.redhat_drive_add
9bac43
357786
Merged patches (2.12.0):
357786
- 8679189 qmp: Report __com.redhat_drive_add error to monitor
357786
9bac43
Merged patches (2.7.0):
9bac43
- 20af75a QMP: Relax __com.redhat_drive_add parameter checking
9bac43
9bac43
(cherry picked from commit 6b8c0495aa317dfc5caa6d204373140811880d1a)
357786
(cherry picked from commit 5d293a214ca093a133011d0edc9039b1e71b4219)
357786
(cherry picked from commit 45f0a917e663aab47217bb8b6cc5bca3a8b1baac)
357786
(cherry picked from commit e15f0bd3c4ccce535ae9a08156aebcd780c38132)
357786
(cherry picked from commit c7ae434601e7439371012494cd026179369af330)
9bac43
---
357786
 device-hotplug.c          | 63 +++++++++++++++++++++++++++++++++++++++++++++++
9bac43
 include/sysemu/blockdev.h |  2 ++
9bac43
 monitor.c                 |  2 ++
9bac43
 qapi/block.json           | 45 +++++++++++++++++++++++++++++++++
357786
 4 files changed, 112 insertions(+)
9bac43
9bac43
diff --git a/device-hotplug.c b/device-hotplug.c
357786
index 23fd665..5575eb7 100644
9bac43
--- a/device-hotplug.c
9bac43
+++ b/device-hotplug.c
357786
@@ -33,6 +33,10 @@
9bac43
 #include "sysemu/sysemu.h"
9bac43
 #include "monitor/monitor.h"
9bac43
 #include "block/block_int.h"
9bac43
+#include "qemu/error-report.h"
9bac43
+#include "qapi/qmp/qerror.h"
9bac43
+#include "qapi/error.h"
9bac43
+
9bac43
 
9bac43
 static DriveInfo *add_init_drive(const char *optstr)
9bac43
 {
357786
@@ -91,3 +95,62 @@ err:
9bac43
         blk_unref(blk);
9bac43
     }
9bac43
 }
9bac43
+
9bac43
+static void check_parm(const char *key, QObject *obj, void *opaque)
9bac43
+{
9bac43
+    static const char *unwanted_keys[] = {
9bac43
+        "bus", "unit", "index", "if", "boot", "addr",
9bac43
+        NULL
9bac43
+
9bac43
+    };
9bac43
+    int *stopped = opaque;
9bac43
+    const char **p;
9bac43
+
9bac43
+    if (*stopped) {
9bac43
+        return;
9bac43
+    }
9bac43
+
9bac43
+    for (p = unwanted_keys; *p; p++) {
9bac43
+        if (!strcmp(key, *p)) {
9bac43
+            error_report(QERR_INVALID_PARAMETER, key);
9bac43
+            *stopped = 1;
9bac43
+            return;
9bac43
+        }
9bac43
+    }
9bac43
+}
9bac43
+
9bac43
+void simple_drive_add(QDict *qdict, QObject **ret_data, Error **errp)
9bac43
+{
9bac43
+    int stopped;
9bac43
+    Error *local_err = NULL;
9bac43
+    QemuOpts *opts;
9bac43
+    DriveInfo *dinfo;
9bac43
+    MachineClass *mc;
9bac43
+
9bac43
+    if (!qdict_haskey(qdict, "id")) {
9bac43
+        error_setg(errp, QERR_MISSING_PARAMETER, "id");
9bac43
+        return;
9bac43
+    }
9bac43
+
9bac43
+    stopped = 0;
9bac43
+    qdict_iter(qdict, check_parm, &stopped);
9bac43
+    if (stopped) {
9bac43
+        return;
9bac43
+    }
9bac43
+
9bac43
+    opts = qemu_opts_from_qdict(&qemu_drive_opts, qdict, &local_err);
9bac43
+    if (!opts) {
9bac43
+        error_propagate(errp, local_err);
9bac43
+        return;
9bac43
+    }
9bac43
+    qemu_opt_set(opts, "if", "none", &error_abort);
9bac43
+    mc = MACHINE_GET_CLASS(current_machine);
9bac43
+    dinfo = drive_new(opts, mc->block_default_type);
9bac43
+    if (!dinfo) {
357786
+        error_setg(errp, QERR_DEVICE_INIT_FAILED, qemu_opts_id(opts));
9bac43
+        qemu_opts_del(opts);
9bac43
+        return;
9bac43
+    }
9bac43
+
9bac43
+    return;
9bac43
+}
9bac43
diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
9bac43
index ac22f2a..3bda14c 100644
9bac43
--- a/include/sysemu/blockdev.h
9bac43
+++ b/include/sysemu/blockdev.h
9bac43
@@ -63,4 +63,6 @@ DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
9bac43
 
9bac43
 void hmp_commit(Monitor *mon, const QDict *qdict);
9bac43
 void hmp_drive_del(Monitor *mon, const QDict *qdict);
9bac43
+
9bac43
+void simple_drive_add(QDict *qdict, QObject **ret_data, Error **errp);
9bac43
 #endif
9bac43
diff --git a/monitor.c b/monitor.c
357786
index 1813d34..c587f21 100644
9bac43
--- a/monitor.c
9bac43
+++ b/monitor.c
357786
@@ -1204,6 +1204,8 @@ static void monitor_init_qmp_commands(void)
9bac43
                          QCO_NO_OPTIONS);
9bac43
     qmp_register_command(&qmp_commands, "netdev_add", qmp_netdev_add,
9bac43
                          QCO_NO_OPTIONS);
9bac43
+    qmp_register_command(&qmp_commands, "__com.redhat_drive_add", simple_drive_add,
9bac43
+                         QCO_NO_OPTIONS);
9bac43
 
9bac43
     qmp_unregister_commands_hack();
9bac43
 
9bac43
diff --git a/qapi/block.json b/qapi/block.json
357786
index e1fe18e..48c732f 100644
9bac43
--- a/qapi/block.json
9bac43
+++ b/qapi/block.json
357786
@@ -211,6 +211,51 @@
9bac43
   'data': { 'id': 'str' } }
9bac43
 
9bac43
 ##
9bac43
+# @__com.redhat_drive_add:
9bac43
+#
9bac43
+# Create a drive similar to -drive if=none.
9bac43
+#
9bac43
+# @id: Drive ID, must be unique
9bac43
+# @file: Disk image
9bac43
+# @format: Disk format
9bac43
+# @aio: How to perform asynchronous disk I/O
9bac43
+# @cache: Host cache use policy
9bac43
+# @cyls, "heads", "secs": Disk geometry
9bac43
+# @trans: BIOS translation mode
9bac43
+# @media: Media type
9bac43
+# @readonly: Open image read-only
9bac43
+# @rerror: What to do on read error
9bac43
+# @werror: What to do on write error
9bac43
+# @serial: Drive serial number
9bac43
+# @snapshot: Enable snapshot mode
9bac43
+# @copy-on-read: Enable copy-on-read mode
9bac43
+#
9bac43
+# Example:
9bac43
+#
9bac43
+# 1. Add a drive without medium:
9bac43
+#
9bac43
+# -> { "execute": "__com.redhat_drive_add", "arguments": { "id": "foo" } }
9bac43
+# <- {"return": {}}
9bac43
+#
9bac43
+# 2. Add a drive with medium:
9bac43
+#
9bac43
+# -> { "execute": "__com.redhat_drive_add",
9bac43
+#      "arguments": { "id": "bar", "file": "tmp.qcow2", "format": "qcow2" } }
9bac43
+# <- {"return": {}}
9bac43
+#
9bac43
+##
9bac43
+{ 'command': '__com.redhat_drive_add',
9bac43
+  'data': { 'id': 'str', '*file': 'str', '*format': 'str',
9bac43
+            '*aio': 'BlockdevAioOptions',
9bac43
+            '*cache': 'BlockdevCacheOptions',
9bac43
+            '*cyls': 'int', '*heads': 'int', '*secs': 'int',
9bac43
+            '*trans': 'str', '*media': 'str',
9bac43
+            '*readonly': 'bool', '*snapshot': 'bool',
9bac43
+            '*rerror': 'str', '*werror': 'str',
9bac43
+            '*copy-on-read': 'bool', '*serial': 'str' },
9bac43
+  'gen': false }                # just to minimize porting churn
9bac43
+
9bac43
+##
9bac43
 # @nbd-server-start:
9bac43
 #
9bac43
 # Start an NBD server listening on the given host and port.  Block
9bac43
-- 
9bac43
1.8.3.1
9bac43