]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Add support for DEVICE_DELETED event
authorJiri Denemark <jdenemar@redhat.com>
Thu, 11 Jul 2013 15:07:26 +0000 (17:07 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 18 Jul 2013 13:28:45 +0000 (15:28 +0200)
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c

index baaaefee09ae6edf5bb21afec9bab36043ff9d2d..16a36644212ca875af5944477446592c9212af57 100644 (file)
@@ -233,6 +233,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "mlock",
 
               "vnc-share-policy", /* 150 */
+              "device-del-event",
     );
 
 struct _virQEMUCaps {
@@ -1335,6 +1336,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
 struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
     { "BALLOON_CHANGE", QEMU_CAPS_BALLOON_EVENT },
     { "SPICE_MIGRATE_COMPLETED", QEMU_CAPS_SEAMLESS_MIGRATION },
+    { "DEVICE_DELETED", QEMU_CAPS_DEVICE_DEL_EVENT },
 };
 
 struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
index 708874746a8edb1d5c6d4674aed2fe9e331f74ba..f5f685df26b62a51105a63e80273ad82e5785049 100644 (file)
@@ -189,6 +189,7 @@ enum virQEMUCapsFlags {
     QEMU_CAPS_DRIVE_DISCARD      = 148, /* -drive discard=off(ignore)|on(unmap) */
     QEMU_CAPS_MLOCK              = 149, /* -realtime mlock=on|off */
     QEMU_CAPS_VNC_SHARE_POLICY   = 150, /* set display sharing policy */
+    QEMU_CAPS_DEVICE_DEL_EVENT   = 151, /* DEVICE_DELETED event */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
index b3880a98e114c27d32d96120978604552d4d6895..1f6ce54846ba1371308180d3ad5046160153f9a6 100644 (file)
@@ -1274,6 +1274,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;
index 62df6b142c059ffbad67456afc058ef128057719..eef0997f0693861e0dab52749f48aa1a1a2c2ef9 100644 (file)
@@ -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);
@@ -223,6 +226,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);
index fb84c03c79c3167172722d9d4426dfe333dc7f35..331810103aa5fe4d225dc2cdc914ac5e3bf41658 100644 (file)
@@ -75,6 +75,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;
@@ -87,6 +88,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, },
@@ -920,6 +922,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,