[libvirt] [PATCH 5/8] Remove use of interfacePrivateData from udev driver

Daniel P. Berrange berrange at redhat.com
Tue Jan 20 16:37:12 UTC 2015


The udev driver can be implemented using global state instead
of the connect private data.
---
 src/interface/interface_backend_udev.c | 103 +++++++++++++++++++--------------
 1 file changed, 58 insertions(+), 45 deletions(-)

diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index d4f8c0f..b027de0 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -48,6 +48,8 @@ typedef enum {
     VIR_UDEV_IFACE_ALL
 } virUdevStatus;
 
+static struct udev_iface_driver *driver;
+
 static virInterfaceDef *udevGetIfaceDef(struct udev *udev, const char *name);
 
 static const char *
@@ -134,48 +136,21 @@ udevGetDevices(struct udev *udev, virUdevStatus status)
 }
 
 static virDrvOpenStatus
-udevInterfaceOpen(virConnectPtr conn,
+udevInterfaceOpen(virConnectPtr conn ATTRIBUTE_UNUSED,
                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                   unsigned int flags)
 {
-    struct udev_iface_driver *driverState = NULL;
-
     virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
 
-    if (VIR_ALLOC(driverState) < 0)
-        goto cleanup;
-
-    driverState->udev = udev_new();
-    if (!driverState->udev) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("failed to create udev context"));
-        goto cleanup;
-    }
-
-    conn->interfacePrivateData = driverState;
+    if (!driver)
+        return VIR_DRV_OPEN_ERROR;
 
     return VIR_DRV_OPEN_SUCCESS;
-
- cleanup:
-    VIR_FREE(driverState);
-
-    return VIR_DRV_OPEN_ERROR;
 }
 
 static int
-udevInterfaceClose(virConnectPtr conn)
+udevInterfaceClose(virConnectPtr conn ATTRIBUTE_UNUSED)
 {
-    struct udev_iface_driver *driverState;
-
-    if (conn->interfacePrivateData != NULL) {
-        driverState = conn->interfacePrivateData;
-
-        udev_unref(driverState->udev);
-
-        VIR_FREE(driverState);
-    }
-
-    conn->interfacePrivateData = NULL;
     return 0;
 }
 
@@ -183,8 +158,7 @@ static int
 udevNumOfInterfacesByStatus(virConnectPtr conn, virUdevStatus status,
                             virInterfaceObjListFilter filter)
 {
-    struct udev_iface_driver *driverState = conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     struct udev_enumerate *enumerate = NULL;
     struct udev_list_entry *devices;
     struct udev_list_entry *dev_entry;
@@ -237,8 +211,7 @@ udevListInterfacesByStatus(virConnectPtr conn,
                            virUdevStatus status,
                            virInterfaceObjListFilter filter)
 {
-    struct udev_iface_driver *driverState = conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     struct udev_enumerate *enumerate = NULL;
     struct udev_list_entry *devices;
     struct udev_list_entry *dev_entry;
@@ -353,7 +326,6 @@ udevConnectListAllInterfaces(virConnectPtr conn,
                              virInterfacePtr **ifaces,
                              unsigned int flags)
 {
-    struct udev_iface_driver *driverState = conn->interfacePrivateData;
     struct udev *udev;
     struct udev_enumerate *enumerate = NULL;
     struct udev_list_entry *devices;
@@ -371,7 +343,7 @@ udevConnectListAllInterfaces(virConnectPtr conn,
         return -1;
 
     /* Grab a udev reference */
-    udev = udev_ref(driverState->udev);
+    udev = udev_ref(driver->udev);
 
     /* List all interfaces in case we support more filter flags in the future */
     enumerate = udevGetDevices(udev, VIR_UDEV_IFACE_ALL);
@@ -483,8 +455,7 @@ udevConnectListAllInterfaces(virConnectPtr conn,
 static virInterfacePtr
 udevInterfaceLookupByName(virConnectPtr conn, const char *name)
 {
-    struct udev_iface_driver *driverState = conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     struct udev_device *dev;
     virInterfacePtr ret = NULL;
     virInterfaceDefPtr def = NULL;
@@ -517,8 +488,7 @@ udevInterfaceLookupByName(virConnectPtr conn, const char *name)
 static virInterfacePtr
 udevInterfaceLookupByMACString(virConnectPtr conn, const char *macstr)
 {
-    struct udev_iface_driver *driverState = conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     struct udev_enumerate *enumerate = NULL;
     struct udev_list_entry *dev_entry;
     struct udev_device *dev;
@@ -1141,8 +1111,7 @@ static char *
 udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
                         unsigned int flags)
 {
-    struct udev_iface_driver *driverState = ifinfo->conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     virInterfaceDef *ifacedef;
     char *xmlstr = NULL;
 
@@ -1173,8 +1142,7 @@ udevInterfaceGetXMLDesc(virInterfacePtr ifinfo,
 static int
 udevInterfaceIsActive(virInterfacePtr ifinfo)
 {
-    struct udev_iface_driver *driverState = ifinfo->conn->interfacePrivateData;
-    struct udev *udev = udev_ref(driverState->udev);
+    struct udev *udev = udev_ref(driver->udev);
     struct udev_device *dev;
     virInterfaceDefPtr def = NULL;
     int status = -1;
@@ -1206,6 +1174,43 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
     return status;
 }
 
+
+static int
+udevStateInitialize(bool privileged ATTRIBUTE_UNUSED,
+                    virStateInhibitCallback callback ATTRIBUTE_UNUSED,
+                    void *opaque ATTRIBUTE_UNUSED)
+{
+    int ret = -1;
+
+    if (VIR_ALLOC(driver) < 0)
+        goto cleanup;
+
+    driver->udev = udev_new();
+    if (!driver->udev) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("failed to create udev context"));
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    return ret;
+}
+
+static int
+udevStateCleanup(void)
+{
+    if (!driver)
+        return -1;
+
+    udev_unref(driver->udev);
+
+    VIR_FREE(driver);
+    return 0;
+}
+
+
 static virInterfaceDriver udevIfaceDriver = {
     "udev",
     .interfaceOpen = udevInterfaceOpen, /* 1.0.0 */
@@ -1221,6 +1226,12 @@ static virInterfaceDriver udevIfaceDriver = {
     .interfaceGetXMLDesc = udevInterfaceGetXMLDesc, /* 1.0.0 */
 };
 
+static virStateDriver interfaceStateDriver = {
+    .name = "udev",
+    .stateInitialize = udevStateInitialize,
+    .stateCleanup = udevStateCleanup,
+};
+
 int
 udevIfaceRegister(void)
 {
@@ -1229,5 +1240,7 @@ udevIfaceRegister(void)
                        _("failed to register udev interface driver"));
         return -1;
     }
+    if (virRegisterStateDriver(&interfaceStateDriver) < 0)
+        return -1;
     return 0;
 }
-- 
2.1.0




More information about the libvir-list mailing list