]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
event: pass reason for PM events
authorEric Blake <eblake@redhat.com>
Wed, 29 Jan 2014 00:41:34 +0000 (17:41 -0700)
committerEric Blake <eblake@redhat.com>
Wed, 12 Feb 2014 17:48:16 +0000 (10:48 -0700)
Commit 57ddcc23 (v0.9.11) introduced the pmwakeup event, with
an optional 'reason' field reserved for possible future expansion.
But it failed to wire the field through RPC, so even if we do
add a reason in the future, we will be unable to get it back
to the user.

Worse, commit 7ba5defb (v1.0.0) repeated the same mistake with
the pmsuspend_disk event.

As long as we are adding new RPC calls, we might as well fix
the events to actually match the signature so that we don't have
to add yet another RPC in the future if we do decide to start
using the reason field.

* src/remote/remote_protocol.x
(remote_domain_event_callback_pmwakeup_msg)
(remote_domain_event_callback_pmsuspend_msg)
(remote_domain_event_callback_pmsuspend_disk_msg): Add reason
field.
* daemon/remote.c (remoteRelayDomainEventPMWakeup)
(remoteRelayDomainEventPMSuspend)
(remoteRelayDomainEventPMSuspendDisk): Pass reason to client.
* src/conf/domain_event.h (virDomainEventPMWakeupNewFromDom)
(virDomainEventPMSuspendNewFromDom)
(virDomainEventPMSuspendDiskNewFromDom): Require additional
parameter.
* src/conf/domain_event.c (virDomainEventPMClass): New class.
(virDomainEventPMDispose): New function.
(virDomainEventPMWakeupNew*, virDomainEventPMSuspendNew*)
(virDomainEventPMSuspendDiskNew*)
(virDomainEventDispatchDefaultFunc): Use new class.
* src/remote/remote_driver.c (remoteDomainBuildEvent*PM*): Pass
reason through.
* src/remote_protocol-structs: Regenerate.

Signed-off-by: Eric Blake <eblake@redhat.com>
daemon/remote.c
src/conf/domain_event.c
src/conf/domain_event.h
src/remote/remote_driver.c
src/remote/remote_protocol.x
src/remote_protocol-structs

index 48c707d19052acc1fcd40193ad808cee7713da97..932f65fc1c5b8786af95f0073d0935961f3248f9 100644 (file)
@@ -714,7 +714,7 @@ remoteRelayDomainEventTrayChange(virConnectPtr conn,
 static int
 remoteRelayDomainEventPMWakeup(virConnectPtr conn,
                                virDomainPtr dom,
-                               int reason ATTRIBUTE_UNUSED,
+                               int reason,
                                void *opaque)
 {
     daemonClientEventCallbackPtr callback = opaque;
@@ -737,7 +737,7 @@ remoteRelayDomainEventPMWakeup(virConnectPtr conn,
                                       (xdrproc_t)xdr_remote_domain_event_pmwakeup_msg, &data);
     } else {
         remote_domain_event_callback_pmwakeup_msg msg = { callback->callbackID,
-                                                          data };
+                                                          reason, data };
 
         remoteDispatchObjectEventSend(callback->client, remoteProgram,
                                       REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMWAKEUP,
@@ -750,7 +750,7 @@ remoteRelayDomainEventPMWakeup(virConnectPtr conn,
 static int
 remoteRelayDomainEventPMSuspend(virConnectPtr conn,
                                 virDomainPtr dom,
-                                int reason ATTRIBUTE_UNUSED,
+                                int reason,
                                 void *opaque)
 {
     daemonClientEventCallbackPtr callback = opaque;
@@ -773,7 +773,7 @@ remoteRelayDomainEventPMSuspend(virConnectPtr conn,
                                       (xdrproc_t)xdr_remote_domain_event_pmsuspend_msg, &data);
     } else {
         remote_domain_event_callback_pmsuspend_msg msg = { callback->callbackID,
-                                                           data };
+                                                           reason, data };
 
         remoteDispatchObjectEventSend(callback->client, remoteProgram,
                                       REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND,
@@ -824,7 +824,7 @@ remoteRelayDomainEventBalloonChange(virConnectPtr conn,
 static int
 remoteRelayDomainEventPMSuspendDisk(virConnectPtr conn,
                                     virDomainPtr dom,
-                                    int reason ATTRIBUTE_UNUSED,
+                                    int reason,
                                     void *opaque)
 {
     daemonClientEventCallbackPtr callback = opaque;
@@ -847,7 +847,7 @@ remoteRelayDomainEventPMSuspendDisk(virConnectPtr conn,
                                       (xdrproc_t)xdr_remote_domain_event_pmsuspend_disk_msg, &data);
     } else {
         remote_domain_event_callback_pmsuspend_disk_msg msg = { callback->callbackID,
-                                                                data };
+                                                                reason, data };
 
         remoteDispatchObjectEventSend(callback->client, remoteProgram,
                                       REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND_DISK,
index a490fe53f525ded3b9c78e1a178e3eae64368785..9c18922b72224a26fad92cecf790089d4f46fd7a 100644 (file)
@@ -47,6 +47,7 @@ static virClassPtr virDomainEventDiskChangeClass;
 static virClassPtr virDomainEventTrayChangeClass;
 static virClassPtr virDomainEventBalloonChangeClass;
 static virClassPtr virDomainEventDeviceRemovedClass;
+static virClassPtr virDomainEventPMClass;
 
 
 static void virDomainEventDispose(void *obj);
@@ -60,6 +61,7 @@ static void virDomainEventDiskChangeDispose(void *obj);
 static void virDomainEventTrayChangeDispose(void *obj);
 static void virDomainEventBalloonChangeDispose(void *obj);
 static void virDomainEventDeviceRemovedDispose(void *obj);
+static void virDomainEventPMDispose(void *obj);
 
 static void
 virDomainEventDispatchDefaultFunc(virConnectPtr conn,
@@ -171,6 +173,14 @@ struct _virDomainEventDeviceRemoved {
 typedef struct _virDomainEventDeviceRemoved virDomainEventDeviceRemoved;
 typedef virDomainEventDeviceRemoved *virDomainEventDeviceRemovedPtr;
 
+struct _virDomainEventPM {
+    virDomainEvent parent;
+
+    int reason;
+};
+typedef struct _virDomainEventPM virDomainEventPM;
+typedef virDomainEventPM *virDomainEventPMPtr;
+
 
 static int
 virDomainEventsOnceInit(void)
@@ -241,6 +251,12 @@ virDomainEventsOnceInit(void)
                       sizeof(virDomainEventDeviceRemoved),
                       virDomainEventDeviceRemovedDispose)))
         return -1;
+    if (!(virDomainEventPMClass =
+          virClassNew(virDomainEventClass,
+                      "virDomainEventPM",
+                      sizeof(virDomainEventPM),
+                      virDomainEventPMDispose)))
+        return -1;
     return 0;
 }
 
@@ -359,6 +375,13 @@ virDomainEventDeviceRemovedDispose(void *obj)
     VIR_FREE(event->devAlias);
 }
 
+static void
+virDomainEventPMDispose(void *obj)
+{
+    virDomainEventPMPtr event = obj;
+    VIR_DEBUG("obj=%p", event);
+}
+
 
 static void *
 virDomainEventNew(virClassPtr klass,
@@ -907,19 +930,21 @@ virDomainEventTrayChangeNewFromDom(virDomainPtr dom,
 static virObjectEventPtr
 virDomainEventPMWakeupNew(int id,
                           const char *name,
-                          unsigned char *uuid)
+                          unsigned char *uuid,
+                          int reason)
 {
-    virObjectEventPtr ev;
+    virDomainEventPMPtr ev;
 
     if (virDomainEventsInitialize() < 0)
         return NULL;
 
-    if (!(ev = virDomainEventNew(virDomainEventClass,
+    if (!(ev = virDomainEventNew(virDomainEventPMClass,
                                  VIR_DOMAIN_EVENT_ID_PMWAKEUP,
                                  id, name, uuid)))
         return NULL;
 
-    return ev;
+    ev->reason = reason;
+    return (virObjectEventPtr)ev;
 }
 
 virObjectEventPtr
@@ -927,31 +952,34 @@ virDomainEventPMWakeupNewFromObj(virDomainObjPtr obj)
 {
     return virDomainEventPMWakeupNew(obj->def->id,
                                      obj->def->name,
-                                     obj->def->uuid);
+                                     obj->def->uuid,
+                                     0);
 }
 
 virObjectEventPtr
-virDomainEventPMWakeupNewFromDom(virDomainPtr dom)
+virDomainEventPMWakeupNewFromDom(virDomainPtr dom, int reason)
 {
-    return virDomainEventPMWakeupNew(dom->id, dom->name, dom->uuid);
+    return virDomainEventPMWakeupNew(dom->id, dom->name, dom->uuid, reason);
 }
 
 static virObjectEventPtr
 virDomainEventPMSuspendNew(int id,
                            const char *name,
-                           unsigned char *uuid)
+                           unsigned char *uuid,
+                           int reason)
 {
-    virObjectEventPtr ev;
+    virDomainEventPMPtr ev;
 
     if (virDomainEventsInitialize() < 0)
         return NULL;
 
-    if (!(ev = virDomainEventNew(virDomainEventClass,
+    if (!(ev = virDomainEventNew(virDomainEventPMClass,
                                  VIR_DOMAIN_EVENT_ID_PMSUSPEND,
                                  id, name, uuid)))
         return NULL;
 
-    return ev;
+    ev->reason = reason;
+    return (virObjectEventPtr)ev;
 }
 
 virObjectEventPtr
@@ -959,30 +987,34 @@ virDomainEventPMSuspendNewFromObj(virDomainObjPtr obj)
 {
     return virDomainEventPMSuspendNew(obj->def->id,
                                       obj->def->name,
-                                      obj->def->uuid);
+                                      obj->def->uuid,
+                                      0);
 }
 
 virObjectEventPtr
-virDomainEventPMSuspendNewFromDom(virDomainPtr dom)
+virDomainEventPMSuspendNewFromDom(virDomainPtr dom, int reason)
 {
-    return virDomainEventPMSuspendNew(dom->id, dom->name, dom->uuid);
+    return virDomainEventPMSuspendNew(dom->id, dom->name, dom->uuid, reason);
 }
 
 static virObjectEventPtr
 virDomainEventPMSuspendDiskNew(int id,
                                const char *name,
-                               unsigned char *uuid)
+                               unsigned char *uuid,
+                               int reason)
 {
-    virObjectEventPtr ev;
+    virDomainEventPMPtr ev;
 
     if (virDomainEventsInitialize() < 0)
         return NULL;
 
-    if (!(ev = virDomainEventNew(virDomainEventClass,
+    if (!(ev = virDomainEventNew(virDomainEventPMClass,
                                  VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK,
                                  id, name, uuid)))
         return NULL;
-    return ev;
+
+    ev->reason = reason;
+    return (virObjectEventPtr)ev;
 }
 
 virObjectEventPtr
@@ -990,13 +1022,15 @@ virDomainEventPMSuspendDiskNewFromObj(virDomainObjPtr obj)
 {
     return virDomainEventPMSuspendDiskNew(obj->def->id,
                                           obj->def->name,
-                                          obj->def->uuid);
+                                          obj->def->uuid,
+                                          0);
 }
 
 virObjectEventPtr
-virDomainEventPMSuspendDiskNewFromDom(virDomainPtr dom)
+virDomainEventPMSuspendDiskNewFromDom(virDomainPtr dom, int reason)
 {
-    return virDomainEventPMSuspendDiskNew(dom->id, dom->name, dom->uuid);
+    return virDomainEventPMSuspendDiskNew(dom->id, dom->name, dom->uuid,
+                                          reason);
 }
 
 virObjectEventPtr
@@ -1217,12 +1251,24 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn,
         }
 
     case VIR_DOMAIN_EVENT_ID_PMWAKEUP:
-        ((virConnectDomainEventPMWakeupCallback)cb)(conn, dom, 0, cbopaque);
-        goto cleanup;
+        {
+            virDomainEventPMPtr pmEvent = (virDomainEventPMPtr)event;
+
+            ((virConnectDomainEventPMWakeupCallback)cb)(conn, dom,
+                                                        pmEvent->reason,
+                                                        cbopaque);
+            goto cleanup;
+        }
 
     case VIR_DOMAIN_EVENT_ID_PMSUSPEND:
-        ((virConnectDomainEventPMSuspendCallback)cb)(conn, dom, 0, cbopaque);
-        goto cleanup;
+        {
+            virDomainEventPMPtr pmEvent = (virDomainEventPMPtr)event;
+
+            ((virConnectDomainEventPMSuspendCallback)cb)(conn, dom,
+                                                         pmEvent->reason,
+                                                         cbopaque);
+            goto cleanup;
+        }
 
     case VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE:
         {
@@ -1236,8 +1282,14 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn,
         }
 
     case VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK:
-        ((virConnectDomainEventPMSuspendDiskCallback)cb)(conn, dom, 0, cbopaque);
-        goto cleanup;
+        {
+            virDomainEventPMPtr pmEvent = (virDomainEventPMPtr)event;
+
+            ((virConnectDomainEventPMSuspendDiskCallback)cb)(conn, dom,
+                                                             pmEvent->reason,
+                                                             cbopaque);
+            goto cleanup;
+        }
 
     case VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED:
         {
index be577e9131a224a04744933b83dce1378f20edcb..300c41b1fd61830ddc98a82274f112d57ff3b844 100644 (file)
@@ -149,11 +149,11 @@ virDomainEventTrayChangeNewFromDom(virDomainPtr dom,
 virObjectEventPtr
 virDomainEventPMWakeupNewFromObj(virDomainObjPtr obj);
 virObjectEventPtr
-virDomainEventPMWakeupNewFromDom(virDomainPtr dom);
+virDomainEventPMWakeupNewFromDom(virDomainPtr dom, int reason);
 virObjectEventPtr
 virDomainEventPMSuspendNewFromObj(virDomainObjPtr obj);
 virObjectEventPtr
-virDomainEventPMSuspendNewFromDom(virDomainPtr dom);
+virDomainEventPMSuspendNewFromDom(virDomainPtr dom, int reason);
 
 virObjectEventPtr
 virDomainEventBalloonChangeNewFromDom(virDomainPtr dom,
@@ -165,7 +165,7 @@ virDomainEventBalloonChangeNewFromObj(virDomainObjPtr obj,
 virObjectEventPtr
 virDomainEventPMSuspendDiskNewFromObj(virDomainObjPtr obj);
 virObjectEventPtr
-virDomainEventPMSuspendDiskNewFromDom(virDomainPtr dom);
+virDomainEventPMSuspendDiskNewFromDom(virDomainPtr dom, int reason);
 
 virObjectEventPtr
 virDomainEventDeviceRemovedNewFromObj(virDomainObjPtr obj,
index 4cdce816a5ec90547531a641decf99d1783ce582..955465a911505acad3889ee286bb49d4d4eb1118 100644 (file)
@@ -5189,7 +5189,8 @@ remoteDomainBuildEventCallbackTrayChange(virNetClientProgramPtr prog ATTRIBUTE_U
 static void
 remoteDomainBuildEventPMWakeupHelper(virConnectPtr conn,
                                      remote_domain_event_pmwakeup_msg *msg,
-                                     int callbackID)
+                                     int callbackID,
+                                     int reason)
 {
     struct private_data *priv = conn->privateData;
     virDomainPtr dom;
@@ -5199,7 +5200,7 @@ remoteDomainBuildEventPMWakeupHelper(virConnectPtr conn,
     if (!dom)
         return;
 
-    event = virDomainEventPMWakeupNewFromDom(dom);
+    event = virDomainEventPMWakeupNewFromDom(dom, reason);
 
     virDomainFree(dom);
 
@@ -5212,7 +5213,7 @@ remoteDomainBuildEventPMWakeup(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
 {
     virConnectPtr conn = opaque;
     remote_domain_event_pmwakeup_msg *msg = evdata;
-    remoteDomainBuildEventPMWakeupHelper(conn, msg, -1);
+    remoteDomainBuildEventPMWakeupHelper(conn, msg, -1, 0);
 }
 static void
 remoteDomainBuildEventCallbackPMWakeup(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
@@ -5221,13 +5222,15 @@ remoteDomainBuildEventCallbackPMWakeup(virNetClientProgramPtr prog ATTRIBUTE_UNU
 {
     virConnectPtr conn = opaque;
     remote_domain_event_callback_pmwakeup_msg *msg = evdata;
-    remoteDomainBuildEventPMWakeupHelper(conn, &msg->msg, msg->callbackID);
+    remoteDomainBuildEventPMWakeupHelper(conn, &msg->msg, msg->callbackID,
+                                         msg->reason);
 }
 
 static void
 remoteDomainBuildEventPMSuspendHelper(virConnectPtr conn,
                                       remote_domain_event_pmsuspend_msg *msg,
-                                      int callbackID)
+                                      int callbackID,
+                                      int reason)
 {
     struct private_data *priv = conn->privateData;
     virDomainPtr dom;
@@ -5237,7 +5240,7 @@ remoteDomainBuildEventPMSuspendHelper(virConnectPtr conn,
     if (!dom)
         return;
 
-    event = virDomainEventPMSuspendNewFromDom(dom);
+    event = virDomainEventPMSuspendNewFromDom(dom, reason);
 
     virDomainFree(dom);
 
@@ -5250,7 +5253,7 @@ remoteDomainBuildEventPMSuspend(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
 {
     virConnectPtr conn = opaque;
     remote_domain_event_pmsuspend_msg *msg = evdata;
-    remoteDomainBuildEventPMSuspendHelper(conn, msg, -1);
+    remoteDomainBuildEventPMSuspendHelper(conn, msg, -1, 0);
 }
 static void
 remoteDomainBuildEventCallbackPMSuspend(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
@@ -5259,7 +5262,8 @@ remoteDomainBuildEventCallbackPMSuspend(virNetClientProgramPtr prog ATTRIBUTE_UN
 {
     virConnectPtr conn = opaque;
     remote_domain_event_callback_pmsuspend_msg *msg = evdata;
-    remoteDomainBuildEventPMSuspendHelper(conn, &msg->msg, msg->callbackID);
+    remoteDomainBuildEventPMSuspendHelper(conn, &msg->msg, msg->callbackID,
+                                          msg->reason);
 }
 
 
@@ -5304,7 +5308,8 @@ remoteDomainBuildEventCallbackBalloonChange(virNetClientProgramPtr prog ATTRIBUT
 static void
 remoteDomainBuildEventPMSuspendDiskHelper(virConnectPtr conn,
                                           remote_domain_event_pmsuspend_disk_msg *msg,
-                                          int callbackID)
+                                          int callbackID,
+                                          int reason)
 {
     struct private_data *priv = conn->privateData;
     virDomainPtr dom;
@@ -5314,7 +5319,7 @@ remoteDomainBuildEventPMSuspendDiskHelper(virConnectPtr conn,
     if (!dom)
         return;
 
-    event = virDomainEventPMSuspendDiskNewFromDom(dom);
+    event = virDomainEventPMSuspendDiskNewFromDom(dom, reason);
 
     virDomainFree(dom);
 
@@ -5327,7 +5332,7 @@ remoteDomainBuildEventPMSuspendDisk(virNetClientProgramPtr prog ATTRIBUTE_UNUSED
 {
     virConnectPtr conn = opaque;
     remote_domain_event_pmsuspend_disk_msg *msg = evdata;
-    remoteDomainBuildEventPMSuspendDiskHelper(conn, msg, -1);
+    remoteDomainBuildEventPMSuspendDiskHelper(conn, msg, -1, 0);
 }
 static void
 remoteDomainBuildEventCallbackPMSuspendDisk(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
@@ -5336,7 +5341,8 @@ remoteDomainBuildEventCallbackPMSuspendDisk(virNetClientProgramPtr prog ATTRIBUT
 {
     virConnectPtr conn = opaque;
     remote_domain_event_callback_pmsuspend_disk_msg *msg = evdata;
-    remoteDomainBuildEventPMSuspendDiskHelper(conn, &msg->msg, msg->callbackID);
+    remoteDomainBuildEventPMSuspendDiskHelper(conn, &msg->msg, msg->callbackID,
+                                              msg->reason);
 }
 
 
index 3e708bc0083dc3245479c66a96de84eccb5e3ff1..f1f23594f53b1d4c792b6740a506553cd94ba4b3 100644 (file)
@@ -2378,6 +2378,7 @@ struct remote_domain_event_pmwakeup_msg {
 };
 struct remote_domain_event_callback_pmwakeup_msg {
     int callbackID;
+    int reason;
     remote_domain_event_pmwakeup_msg msg;
 };
 
@@ -2386,6 +2387,7 @@ struct remote_domain_event_pmsuspend_msg {
 };
 struct remote_domain_event_callback_pmsuspend_msg {
     int callbackID;
+    int reason;
     remote_domain_event_pmsuspend_msg msg;
 };
 
@@ -2403,6 +2405,7 @@ struct remote_domain_event_pmsuspend_disk_msg {
 };
 struct remote_domain_event_callback_pmsuspend_disk_msg {
     int callbackID;
+    int reason;
     remote_domain_event_pmsuspend_disk_msg msg;
 };
 
index fdff787164c3c6628e77933e9e3b19519cd0d96d..5636d55b8b5adef636d222fe22c3405fe46c83cb 100644 (file)
@@ -1824,6 +1824,7 @@ struct remote_domain_event_pmwakeup_msg {
 };
 struct remote_domain_event_callback_pmwakeup_msg {
         int                        callbackID;
+        int                        reason;
         remote_domain_event_pmwakeup_msg msg;
 };
 struct remote_domain_event_pmsuspend_msg {
@@ -1831,6 +1832,7 @@ struct remote_domain_event_pmsuspend_msg {
 };
 struct remote_domain_event_callback_pmsuspend_msg {
         int                        callbackID;
+        int                        reason;
         remote_domain_event_pmsuspend_msg msg;
 };
 struct remote_domain_event_balloon_change_msg {
@@ -1846,6 +1848,7 @@ struct remote_domain_event_pmsuspend_disk_msg {
 };
 struct remote_domain_event_callback_pmsuspend_disk_msg {
         int                        callbackID;
+        int                        reason;
         remote_domain_event_pmsuspend_disk_msg msg;
 };
 struct remote_domain_managed_save_args {