---
src/node_device/node_device_udev.c | 46 ++++++++++++++++++++++++++++++--------
1 file changed, 37 insertions(+), 9 deletions(-)
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index 76c60ea..e7a407f 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -28,6 +28,7 @@
#include "dirname.h"
#include "node_device_conf.h"
+#include "node_device_event.h"
#include "node_device_driver.h"
#include "node_device_linux_sysfs.h"
#include "node_device_udev.h"
@@ -1024,22 +1025,31 @@ static int udevGetDeviceDetails(struct udev_device *device,
static int udevRemoveOneDevice(struct udev_device *device)
{
virNodeDeviceObjPtr dev = NULL;
+ virObjectEventPtr event = NULL;
const char *name = NULL;
- int ret = 0;
+ int ret = -1;
name = udev_device_get_syspath(device);
dev = virNodeDeviceFindBySysfsPath(&driver->devs, name);
- if (dev != NULL) {
- VIR_DEBUG("Removing device '%s' with sysfs path '%s'",
- dev->def->name, name);
- virNodeDeviceObjRemove(&driver->devs, dev);
- } else {
+ if (!dev) {
VIR_DEBUG("Failed to find device to remove that has udev name
'%s'",
name);
- ret = -1;
+ goto cleanup;
}
+ event = virNodeDeviceEventLifecycleNew(dev->def->name,
+ VIR_NODE_DEVICE_EVENT_DELETED,
+ 0);
+
+ VIR_DEBUG("Removing device '%s' with sysfs path '%s'",
+ dev->def->name, name);
+ virNodeDeviceObjRemove(&driver->devs, dev);
+
+ ret = 0;
+ cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->nodeDeviceEventState, event);
return ret;
}
@@ -1096,6 +1106,8 @@ static int udevAddOneDevice(struct udev_device *device)
{
virNodeDeviceDefPtr def = NULL;
virNodeDeviceObjPtr dev = NULL;
+ virObjectEventPtr event = NULL;
+ bool new_device;
int ret = -1;
if (VIR_ALLOC(def) != 0)
@@ -1119,17 +1131,28 @@ static int udevAddOneDevice(struct udev_device *device)
if (udevSetParent(device, def) != 0)
goto cleanup;
+ dev = virNodeDeviceFindByName(&driver->devs, def->name);
+ new_device = !!dev;
+ if (new_device)
+ nodeDeviceUnlock();
+
/* If this is a device change, the old definition will be freed
* and the current definition will take its place. */
dev = virNodeDeviceAssignDef(&driver->devs, def);
- if (dev == NULL)
- goto cleanup;
+
+ if (new_device)
+ event = virNodeDeviceEventLifecycleNew(dev->def->name,
+ VIR_NODE_DEVICE_EVENT_CREATED,
+ 0);
virNodeDeviceObjUnlock(dev);
ret = 0;
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->nodeDeviceEventState, event);
+
if (ret != 0) {
VIR_DEBUG("Discarding device %d %p %s", ret, def,
def ? NULLSTR(def->sysfs_path) : "");
@@ -1241,6 +1264,8 @@ static int nodeStateCleanup(void)
nodeDeviceLock();
+ virObjectEventStateFree(driver->nodeDeviceEventState);
+
priv = driver->privateData;
if (priv) {
@@ -1456,6 +1481,7 @@ static int nodeStateInitialize(bool privileged,
driver->privateData = priv;
nodeDeviceLock();
+ driver->nodeDeviceEventState = virObjectEventStateNew();
if (udevPCITranslateInit(privileged) < 0)
goto cleanup;
@@ -1526,6 +1552,8 @@ static virNodeDeviceDriver udevNodeDeviceDriver = {
.nodeNumOfDevices = nodeNumOfDevices, /* 0.7.3 */
.nodeListDevices = nodeListDevices, /* 0.7.3 */
.connectListAllNodeDevices = nodeConnectListAllNodeDevices, /* 0.10.2 */
+ .connectNodeDeviceEventRegisterAny = nodeConnectNodeDeviceEventRegisterAny, /* 2.2.0
*/
+ .connectNodeDeviceEventDeregisterAny = nodeConnectNodeDeviceEventDeregisterAny, /*
2.2.0 */
.nodeDeviceLookupByName = nodeDeviceLookupByName, /* 0.7.3 */
.nodeDeviceLookupSCSIHostByWWN = nodeDeviceLookupSCSIHostByWWN, /* 1.0.2 */
.nodeDeviceGetXMLDesc = nodeDeviceGetXMLDesc, /* 0.7.3 */
--
2.7.4