File libvirt-qemu-Add-support-for-DEVICE_DELETED-event.patch of Package libvirt
From 8e87c9d13a36a9808b9657ff43dbb5686a093df6 Mon Sep 17 00:00:00 2001
Message-Id: <8e87c9d13a36a9808b9657ff43dbb5686a093df6@dist-git>
From: Jiri Denemark <jdenemar@redhat.com>
Date: Thu, 11 Jul 2013 17:07:26 +0200
Subject: [PATCH] qemu: Add support for DEVICE_DELETED event
https://bugzilla.redhat.com/show_bug.cgi?id=807023
(cherry picked from commit ab47cc9bf97d838a92d8b4dd40bd83c8e50e1083)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Conflicts:
src/qemu/qemu_capabilities.c -- missing caps; no 61a28414
src/qemu/qemu_capabilities.h -- missing caps
---
src/qemu/qemu_capabilities.c | 3 +++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_monitor.c | 13 +++++++++++++
src/qemu/qemu_monitor.h | 5 +++++
src/qemu/qemu_monitor_json.c | 15 +++++++++++++++
5 files changed, 37 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index fb50b82..2d7b565 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -207,6 +207,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
"spice-file-xfer-disable",
"host-pci-multidomain",
"msg-timestamp",
+ "device-del-event",
);
struct _qemuCaps {
@@ -1999,6 +2000,8 @@ qemuCapsProbeQMPEvents(qemuCapsPtr caps,
if (STREQ(name, "BALLOON_CHANGE"))
qemuCapsSet(caps, QEMU_CAPS_BALLOON_EVENT);
+ else if (STREQ(name, "DEVICE_DELETED"))
+ qemuCapsSet(caps, QEMU_CAPS_DEVICE_DEL_EVENT);
VIR_FREE(name);
}
VIR_FREE(events);
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 9e41e3c..3f6ac2c 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -175,6 +175,7 @@ enum qemuCapsFlags {
QEMU_CAPS_SPICE_FILE_XFER_DISABLE, /* -spice disable-agent-file-xfer */
QEMU_CAPS_HOST_PCI_MULTIDOMAIN, /* support domain > 0 in host pci address */
QEMU_CAPS_MSG_TIMESTAMP, /* -msg timestamp */
+ QEMU_CAPS_DEVICE_DEL_EVENT, /* DEVICE_DELETED event */
QEMU_CAPS_LAST, /* this must always be the last item */
};
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 15d027a..adefc27 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1172,6 +1172,19 @@ int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
}
+int
+qemuMonitorEmitDeviceDeleted(qemuMonitorPtr mon,
+ const char *devAlias)
+{
+ int ret = -1;
+ VIR_DEBUG("mon=%p", mon);
+
+ QEMU_MONITOR_CALLBACK(mon, ret, domainDeviceDeleted, mon->vm, devAlias);
+
+ return ret;
+}
+
+
int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
{
int ret;
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index ced6b03..38bdd46 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -142,6 +142,9 @@ struct _qemuMonitorCallbacks {
virDomainObjPtr vm);
int (*domainGuestPanic)(qemuMonitorPtr mon,
virDomainObjPtr vm);
+ int (*domainDeviceDeleted)(qemuMonitorPtr mon,
+ virDomainObjPtr vm,
+ const char *devAlias);
};
char *qemuMonitorEscapeArg(const char *in);
@@ -222,6 +225,8 @@ int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
unsigned long long actual);
int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon);
int qemuMonitorEmitGuestPanic(qemuMonitorPtr mon);
+int qemuMonitorEmitDeviceDeleted(qemuMonitorPtr mon,
+ const char *devAlias);
int qemuMonitorStartCPUs(qemuMonitorPtr mon,
virConnectPtr conn);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 4a78735..0f6281a 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -74,6 +74,7 @@ static void qemuMonitorJSONHandleBlockJobReady(qemuMonitorPtr mon, virJSONValueP
static void qemuMonitorJSONHandleBalloonChange(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandlePMSuspendDisk(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleGuestPanic(qemuMonitorPtr mon, virJSONValuePtr data);
+static void qemuMonitorJSONHandleDeviceDeleted(qemuMonitorPtr mon, virJSONValuePtr data);
typedef struct {
const char *type;
@@ -86,6 +87,7 @@ static qemuEventHandler eventHandlers[] = {
{ "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, },
{ "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, },
{ "BLOCK_JOB_READY", qemuMonitorJSONHandleBlockJobReady, },
+ { "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, },
{ "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
{ "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
{ "POWERDOWN", qemuMonitorJSONHandlePowerdown, },
@@ -927,6 +929,19 @@ qemuMonitorJSONHandlePMSuspendDisk(qemuMonitorPtr mon,
qemuMonitorEmitPMSuspendDisk(mon);
}
+static void
+qemuMonitorJSONHandleDeviceDeleted(qemuMonitorPtr mon, virJSONValuePtr data)
+{
+ const char *device;
+
+ if (!(device = virJSONValueObjectGetString(data, "device"))) {
+ VIR_WARN("missing device in device deleted event");
+ return;
+ }
+
+ qemuMonitorEmitDeviceDeleted(mon, device);
+}
+
int
qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
const char *cmd_str,
--
2.0.0