----- Original Message -----
From: "Eric Blake" <eblake(a)redhat.com>
To: libvir-list(a)redhat.com
Cc: pbonzini(a)redhat.com, fsimonce(a)redhat.com
Sent: Friday, April 6, 2012 6:36:54 AM
Subject: [PATCHv2 08/15] blockjob: expose qemu commands for mirrored storage migration
The new block copy storage migration sequence requires both the
'drive-mirror' action in 'transaction' (present if the
'drive-mirror'
standalone monitor command also exists) and the 'drive-reopen'
monitor
command (it would be nice if that were also part of a 'transaction',
but the initial qemu implementation has it standalone only).
As of this[1] qemu email, both commands have been proposed but not
yet
incorporated into the tree, so there is a risk that qemu 1.1 will
not have these commands, or will have something subtly different.
[
1]https://lists.gnu.org/archive/html/qemu-devel/2012-03/msg01524.html
* src/qemu/qemu_capabilities.h (QEMU_CAPS_DRIVE_MIRROR)
(QEMU_CAPS_DRIVE_REOPEN): New bits.
* src/qemu/qemu_capabilities.c (qemuCaps): Name them.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONCheckCommands): Set
them.
(qemuMonitorJSONDriveMirror, qemuMonitorDriveReopen): New functions.
* src/qemu/qemu_monitor_json.h (qemuMonitorJSONDriveMirror)
(qemuMonitorDriveReopen): Declare them.
* src/qemu/qemu_monitor.c (qemuMonitorDriveMirror)
(qemuMonitorDriveReopen): New passthroughs.
* src/qemu/qemu_monitor.h (qemuMonitorDriveMirror)
(qemuMonitorDriveReopen): Declare them.
---
src/qemu/qemu_capabilities.c | 3 ++
src/qemu/qemu_capabilities.h | 2 +
src/qemu/qemu_monitor.c | 50 ++++++++++++++++++++++++++++
src/qemu/qemu_monitor.h | 23 +++++++++++++
src/qemu/qemu_monitor_json.c | 74
+++++++++++++++++++++++++++++++++++++++--
src/qemu/qemu_monitor_json.h | 21 +++++++++++-
6 files changed, 167 insertions(+), 6 deletions(-)
[...]
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index e1a8d4c..f33bed8 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2685,6 +2685,32 @@ qemuMonitorDiskSnapshot(qemuMonitorPtr mon,
virJSONValuePtr actions,
return ret;
}
+/* Add the drive-mirror action to a transaction. */
+int
+qemuMonitorDriveMirror(qemuMonitorPtr mon, virJSONValuePtr actions,
+ const char *device, const char *file,
+ const char *format, int mode)
+{
+ int ret;
+
+ VIR_DEBUG("mon=%p, actions=%p, device=%s, file=%s, format=%s,
mode=%o",
+ mon, actions, device, file, format, mode);
+
+ if (!mon) {
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (mon->json)
+ ret = qemuMonitorJSONDriveMirror(mon, actions, device, file,
format,
+ mode);
+ else
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("drive-mirror requires JSON monitor"));
You should set ret to -1 here (or return -1).
+ return ret;
+}
+
/* Use the transaction QMP command to run atomic snapshot commands.
*/
int
qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr actions)
@@ -2701,6 +2727,30 @@ qemuMonitorTransaction(qemuMonitorPtr mon,
virJSONValuePtr actions)
return ret;
}
+/* Use the drive-reopen monitor command. */
+int
+qemuMonitorDriveReopen(qemuMonitorPtr mon, const char *device,
+ const char *file, const char *format)
+{
+ int ret;
+
+ VIR_DEBUG("mon=%p, device=%s, file=%s, format=%s",
+ mon, device, file, format);
+
+ if (!mon) {
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (mon->json)
+ ret = qemuMonitorJSONDriveReopen(mon, device, file, format);
+ else
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("drive-reopen requires JSON monitor"));
You should set ret to -1 here (or return -1).
+ return ret;
+}
+
int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
const char *cmd,
char **reply,
--
Federico