|
|
43fe83 |
From 6b1a948213c7db3eede8350f534ec3813e8b296e Mon Sep 17 00:00:00 2001
|
|
|
43fe83 |
Message-Id: <6b1a948213c7db3eede8350f534ec3813e8b296e.1379193141.git.jdenemar@redhat.com>
|
|
|
43fe83 |
From: Laine Stump <laine@laine.org>
|
|
|
43fe83 |
Date: Thu, 12 Sep 2013 06:32:06 -0600
|
|
|
43fe83 |
Subject: [PATCH] netcf driver: use a single netcf handle for all connections
|
|
|
43fe83 |
|
|
|
43fe83 |
This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=983026
|
|
|
43fe83 |
|
|
|
43fe83 |
The netcf interface driver previously had no state driver associated
|
|
|
43fe83 |
with it - as a connection was opened, it would create a new netcf
|
|
|
43fe83 |
instance just for that connection, and close it when it was
|
|
|
43fe83 |
finished. the problem with this is that each connection to libvirt
|
|
|
43fe83 |
used up a netlink socket, and there is a per process maximum of ~1000
|
|
|
43fe83 |
netlink sockets.
|
|
|
43fe83 |
|
|
|
43fe83 |
The solution is to create a state driver to go along with the netcf
|
|
|
43fe83 |
driver. The state driver will opens a netcf instance, then all
|
|
|
43fe83 |
connections share that same netcf instance, thus only a single
|
|
|
43fe83 |
netlink socket will be used no matter how many connections are mde to
|
|
|
43fe83 |
libvirtd.
|
|
|
43fe83 |
|
|
|
43fe83 |
This was rather simple to do - a new virObjectLockable class is
|
|
|
43fe83 |
created for the single driverState object, which is created in
|
|
|
43fe83 |
netcfStateInitialize and contains the single netcf handle; instead of
|
|
|
43fe83 |
creating a new object for each client connection, netcfInterfaceOpen
|
|
|
43fe83 |
now just increments the driverState object's reference count and puts
|
|
|
43fe83 |
a pointer to it into the connection's privateData. Similarly,
|
|
|
43fe83 |
netcfInterfaceClose() just un-refs the driverState object (as does
|
|
|
43fe83 |
netcfStateCleanup()), and virNetcfInterfaceDriverStateDispose()
|
|
|
43fe83 |
handles closing the netcf instance. Since all the functions already
|
|
|
43fe83 |
have locking around them, the static lock functions used by all
|
|
|
43fe83 |
functions just needed to be changed to call virObjectLock() and
|
|
|
43fe83 |
virObjectUnlock() instead of directly calling the virMutex* functions.
|
|
|
43fe83 |
|
|
|
43fe83 |
(cherry picked from commit 822fe1367dd55e3de7c3c044ee02fd733ab3415a)
|
|
|
43fe83 |
---
|
|
|
43fe83 |
src/interface/interface_backend_netcf.c | 230 +++++++++++++++++++++-----------
|
|
|
43fe83 |
1 file changed, 150 insertions(+), 80 deletions(-)
|
|
|
43fe83 |
|
|
|
43fe83 |
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
|
|
|
43fe83 |
index f47669e..fac059d 100644
|
|
|
43fe83 |
--- a/src/interface/interface_backend_netcf.c
|
|
|
43fe83 |
+++ b/src/interface/interface_backend_netcf.c
|
|
|
43fe83 |
@@ -41,21 +41,114 @@
|
|
|
43fe83 |
/* Main driver state */
|
|
|
43fe83 |
typedef struct
|
|
|
43fe83 |
{
|
|
|
43fe83 |
- virMutex lock;
|
|
|
43fe83 |
+ virObjectLockable parent;
|
|
|
43fe83 |
struct netcf *netcf;
|
|
|
43fe83 |
} virNetcfDriverState, *virNetcfDriverStatePtr;
|
|
|
43fe83 |
|
|
|
43fe83 |
+static virClassPtr virNetcfDriverStateClass;
|
|
|
43fe83 |
+static void virNetcfDriverStateDispose(void *obj);
|
|
|
43fe83 |
|
|
|
43fe83 |
-static void interfaceDriverLock(virNetcfDriverStatePtr driver)
|
|
|
43fe83 |
+static int
|
|
|
43fe83 |
+virNetcfDriverStateOnceInit(void)
|
|
|
43fe83 |
+{
|
|
|
43fe83 |
+ if (!(virNetcfDriverStateClass = virClassNew(virClassForObjectLockable(),
|
|
|
43fe83 |
+ "virNetcfDriverState",
|
|
|
43fe83 |
+ sizeof(virNetcfDriverState),
|
|
|
43fe83 |
+ virNetcfDriverStateDispose)))
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+ return 0;
|
|
|
43fe83 |
+}
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+VIR_ONCE_GLOBAL_INIT(virNetcfDriverState)
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+static virNetcfDriverStatePtr driverState = NULL;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+static void
|
|
|
43fe83 |
+virNetcfDriverStateDispose(void *obj)
|
|
|
43fe83 |
{
|
|
|
43fe83 |
- virMutexLock(&driver->lock);
|
|
|
43fe83 |
+ virNetcfDriverStatePtr driver = obj;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ if (driver->netcf)
|
|
|
43fe83 |
+ ncf_close(driver->netcf);
|
|
|
43fe83 |
+}
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+static int
|
|
|
43fe83 |
+netcfStateInitialize(bool privileged ATTRIBUTE_UNUSED,
|
|
|
43fe83 |
+ virStateInhibitCallback callback ATTRIBUTE_UNUSED,
|
|
|
43fe83 |
+ void *opaque ATTRIBUTE_UNUSED)
|
|
|
43fe83 |
+{
|
|
|
43fe83 |
+ if (virNetcfDriverStateInitialize() < 0)
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ if (!(driverState = virObjectLockableNew(virNetcfDriverStateClass)))
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ /* open netcf */
|
|
|
43fe83 |
+ if (ncf_init(&driverState->netcf, NULL) != 0) {
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("failed to initialize netcf"));
|
|
|
43fe83 |
+ virObjectUnref(driverState);
|
|
|
43fe83 |
+ driverState = NULL;
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+ return 0;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
-static void interfaceDriverUnlock(virNetcfDriverStatePtr driver)
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+static int
|
|
|
43fe83 |
+netcfStateCleanup(void)
|
|
|
43fe83 |
{
|
|
|
43fe83 |
- virMutexUnlock(&driver->lock);
|
|
|
43fe83 |
+ if (!driverState) {
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("Attempt to close netcf state driver already closed"));
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ if (virObjectUnref(driverState)) {
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("Attempt to close netcf state driver "
|
|
|
43fe83 |
+ "with open connections"));
|
|
|
43fe83 |
+ return -1;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+ driverState = NULL;
|
|
|
43fe83 |
+ return 0;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+static int
|
|
|
43fe83 |
+netcfStateReload(void)
|
|
|
43fe83 |
+{
|
|
|
43fe83 |
+ int ret = -1;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ if (!driverState)
|
|
|
43fe83 |
+ return 0;
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ virObjectLock(driverState);
|
|
|
43fe83 |
+ ncf_close(driverState->netcf);
|
|
|
43fe83 |
+ if (ncf_init(&driverState->netcf, NULL) != 0)
|
|
|
43fe83 |
+ {
|
|
|
43fe83 |
+ /* this isn't a good situation, because we can't shut down the
|
|
|
43fe83 |
+ * driver as there may still be connections to it. If we set
|
|
|
43fe83 |
+ * the netcf handle to NULL, any subsequent calls to netcf
|
|
|
43fe83 |
+ * will just fail rather than causing a crash. Not ideal, but
|
|
|
43fe83 |
+ * livable (since this should never happen).
|
|
|
43fe83 |
+ */
|
|
|
43fe83 |
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
+ _("failed to re-init netcf"));
|
|
|
43fe83 |
+ driverState->netcf = NULL;
|
|
|
43fe83 |
+ goto cleanup;
|
|
|
43fe83 |
+ }
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ ret = 0;
|
|
|
43fe83 |
+cleanup:
|
|
|
43fe83 |
+ virObjectUnlock(driverState);
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+ return ret;
|
|
|
43fe83 |
+}
|
|
|
43fe83 |
+
|
|
|
43fe83 |
+
|
|
|
43fe83 |
/*
|
|
|
43fe83 |
* Get a minimal virInterfaceDef containing enough metadata
|
|
|
43fe83 |
* for access control checks to be performed. Currently
|
|
|
43fe83 |
@@ -148,61 +241,30 @@ static struct netcf_if *interfaceDriverGetNetcfIF(struct netcf *ncf, virInterfac
|
|
|
43fe83 |
return iface;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
-static virDrvOpenStatus netcfInterfaceOpen(virConnectPtr conn,
|
|
|
43fe83 |
- virConnectAuthPtr auth ATTRIBUTE_UNUSED,
|
|
|
43fe83 |
- unsigned int flags)
|
|
|
43fe83 |
+static virDrvOpenStatus
|
|
|
43fe83 |
+netcfInterfaceOpen(virConnectPtr conn,
|
|
|
43fe83 |
+ virConnectAuthPtr auth ATTRIBUTE_UNUSED,
|
|
|
43fe83 |
+ unsigned int flags)
|
|
|
43fe83 |
{
|
|
|
43fe83 |
- virNetcfDriverStatePtr driverState;
|
|
|
43fe83 |
-
|
|
|
43fe83 |
virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
|
|
|
43fe83 |
|
|
|
43fe83 |
- if (VIR_ALLOC(driverState) < 0)
|
|
|
43fe83 |
- goto alloc_error;
|
|
|
43fe83 |
-
|
|
|
43fe83 |
- /* initialize non-0 stuff in driverState */
|
|
|
43fe83 |
- if (virMutexInit(&driverState->lock) < 0)
|
|
|
43fe83 |
- {
|
|
|
43fe83 |
- /* what error to report? */
|
|
|
43fe83 |
- goto mutex_error;
|
|
|
43fe83 |
- }
|
|
|
43fe83 |
-
|
|
|
43fe83 |
- /* open netcf */
|
|
|
43fe83 |
- if (ncf_init(&driverState->netcf, NULL) != 0)
|
|
|
43fe83 |
- {
|
|
|
43fe83 |
- /* what error to report? */
|
|
|
43fe83 |
- goto netcf_error;
|
|
|
43fe83 |
- }
|
|
|
43fe83 |
+ if (!driverState)
|
|
|
43fe83 |
+ return VIR_DRV_OPEN_ERROR;
|
|
|
43fe83 |
|
|
|
43fe83 |
+ virObjectRef(driverState);
|
|
|
43fe83 |
conn->interfacePrivateData = driverState;
|
|
|
43fe83 |
return VIR_DRV_OPEN_SUCCESS;
|
|
|
43fe83 |
-
|
|
|
43fe83 |
-netcf_error:
|
|
|
43fe83 |
- if (driverState->netcf)
|
|
|
43fe83 |
- {
|
|
|
43fe83 |
- ncf_close(driverState->netcf);
|
|
|
43fe83 |
- }
|
|
|
43fe83 |
- virMutexDestroy(&driverState->lock);
|
|
|
43fe83 |
-mutex_error:
|
|
|
43fe83 |
- VIR_FREE(driverState);
|
|
|
43fe83 |
-alloc_error:
|
|
|
43fe83 |
- return VIR_DRV_OPEN_ERROR;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
-static int netcfInterfaceClose(virConnectPtr conn)
|
|
|
43fe83 |
+static int
|
|
|
43fe83 |
+netcfInterfaceClose(virConnectPtr conn)
|
|
|
43fe83 |
{
|
|
|
43fe83 |
|
|
|
43fe83 |
if (conn->interfacePrivateData != NULL)
|
|
|
43fe83 |
{
|
|
|
43fe83 |
- virNetcfDriverStatePtr driver = conn->interfacePrivateData;
|
|
|
43fe83 |
-
|
|
|
43fe83 |
- /* close netcf instance */
|
|
|
43fe83 |
- ncf_close(driver->netcf);
|
|
|
43fe83 |
- /* destroy lock */
|
|
|
43fe83 |
- virMutexDestroy(&driver->lock);
|
|
|
43fe83 |
- /* free driver state */
|
|
|
43fe83 |
- VIR_FREE(driver);
|
|
|
43fe83 |
+ virObjectUnref(conn->interfacePrivateData);
|
|
|
43fe83 |
+ conn->interfacePrivateData = NULL;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
- conn->interfacePrivateData = NULL;
|
|
|
43fe83 |
return 0;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -408,11 +470,11 @@ static int netcfConnectNumOfInterfaces(virConnectPtr conn)
|
|
|
43fe83 |
if (virConnectNumOfInterfacesEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
count = netcfConnectNumOfInterfacesImpl(conn,
|
|
|
43fe83 |
NETCF_IFACE_ACTIVE,
|
|
|
43fe83 |
virConnectNumOfInterfacesCheckACL);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return count;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -424,12 +486,12 @@ static int netcfConnectListInterfaces(virConnectPtr conn, char **const names, in
|
|
|
43fe83 |
if (virConnectListInterfacesEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
count = netcfConnectListInterfacesImpl(conn,
|
|
|
43fe83 |
NETCF_IFACE_ACTIVE,
|
|
|
43fe83 |
names, nnames,
|
|
|
43fe83 |
virConnectListInterfacesCheckACL);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return count;
|
|
|
43fe83 |
|
|
|
43fe83 |
}
|
|
|
43fe83 |
@@ -442,11 +504,11 @@ static int netcfConnectNumOfDefinedInterfaces(virConnectPtr conn)
|
|
|
43fe83 |
if (virConnectNumOfDefinedInterfacesEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
count = netcfConnectNumOfInterfacesImpl(conn,
|
|
|
43fe83 |
NETCF_IFACE_INACTIVE,
|
|
|
43fe83 |
virConnectNumOfDefinedInterfacesCheckACL);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return count;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -458,12 +520,12 @@ static int netcfConnectListDefinedInterfaces(virConnectPtr conn, char **const na
|
|
|
43fe83 |
if (virConnectListDefinedInterfacesEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
count = netcfConnectListInterfacesImpl(conn,
|
|
|
43fe83 |
NETCF_IFACE_INACTIVE,
|
|
|
43fe83 |
names, nnames,
|
|
|
43fe83 |
virConnectListDefinedInterfacesCheckACL);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return count;
|
|
|
43fe83 |
|
|
|
43fe83 |
}
|
|
|
43fe83 |
@@ -490,7 +552,7 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
|
|
|
43fe83 |
if (virConnectListAllInterfacesEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
/* List all interfaces, in case of we might support new filter flags
|
|
|
43fe83 |
* except active|inactive in future.
|
|
|
43fe83 |
@@ -621,7 +683,7 @@ cleanup:
|
|
|
43fe83 |
VIR_FREE(tmp_iface_objs);
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -634,7 +696,7 @@ static virInterfacePtr netcfInterfaceLookupByName(virConnectPtr conn,
|
|
|
43fe83 |
virInterfacePtr ret = NULL;
|
|
|
43fe83 |
virInterfaceDefPtr def = NULL;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
iface = ncf_lookup_by_name(driver->netcf, name);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
const char *errmsg, *details;
|
|
|
43fe83 |
@@ -662,7 +724,7 @@ static virInterfacePtr netcfInterfaceLookupByName(virConnectPtr conn,
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -675,7 +737,7 @@ static virInterfacePtr netcfInterfaceLookupByMACString(virConnectPtr conn,
|
|
|
43fe83 |
virInterfacePtr ret = NULL;
|
|
|
43fe83 |
virInterfaceDefPtr def = NULL;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
niface = ncf_lookup_by_mac_string(driver->netcf, macstr, 1, &iface);
|
|
|
43fe83 |
|
|
|
43fe83 |
if (niface < 0) {
|
|
|
43fe83 |
@@ -711,7 +773,7 @@ static virInterfacePtr netcfInterfaceLookupByMACString(virConnectPtr conn,
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -726,7 +788,7 @@ static char *netcfInterfaceGetXMLDesc(virInterfacePtr ifinfo,
|
|
|
43fe83 |
|
|
|
43fe83 |
virCheckFlags(VIR_INTERFACE_XML_INACTIVE, NULL);
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
@@ -768,7 +830,7 @@ cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
VIR_FREE(xmlstr);
|
|
|
43fe83 |
virInterfaceDefFree(ifacedef);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -784,7 +846,7 @@ static virInterfacePtr netcfInterfaceDefineXML(virConnectPtr conn,
|
|
|
43fe83 |
|
|
|
43fe83 |
virCheckFlags(0, NULL);
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
ifacedef = virInterfaceDefParseString(xml);
|
|
|
43fe83 |
if (!ifacedef) {
|
|
|
43fe83 |
@@ -818,7 +880,7 @@ cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
VIR_FREE(xmlstr);
|
|
|
43fe83 |
virInterfaceDefFree(ifacedef);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -828,7 +890,7 @@ static int netcfInterfaceUndefine(virInterfacePtr ifinfo) {
|
|
|
43fe83 |
virInterfaceDefPtr def = NULL;
|
|
|
43fe83 |
int ret = -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
@@ -857,7 +919,7 @@ static int netcfInterfaceUndefine(virInterfacePtr ifinfo) {
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -871,7 +933,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
|
|
|
43fe83 |
|
|
|
43fe83 |
virCheckFlags(0, -1);
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
@@ -900,7 +962,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -914,7 +976,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
|
|
|
43fe83 |
|
|
|
43fe83 |
virCheckFlags(0, -1);
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
@@ -943,7 +1005,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -955,7 +1017,7 @@ static int netcfInterfaceIsActive(virInterfacePtr ifinfo)
|
|
|
43fe83 |
virInterfaceDefPtr def = NULL;
|
|
|
43fe83 |
int ret = -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
iface = interfaceDriverGetNetcfIF(driver->netcf, ifinfo);
|
|
|
43fe83 |
if (!iface) {
|
|
|
43fe83 |
@@ -985,7 +1047,7 @@ static int netcfInterfaceIsActive(virInterfacePtr ifinfo)
|
|
|
43fe83 |
cleanup:
|
|
|
43fe83 |
ncf_if_free(iface);
|
|
|
43fe83 |
virInterfaceDefFree(def);
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -1000,7 +1062,7 @@ static int netcfInterfaceChangeBegin(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
if (virInterfaceChangeBeginEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
ret = ncf_change_begin(driver->netcf, 0);
|
|
|
43fe83 |
if (ret < 0) {
|
|
|
43fe83 |
@@ -1012,7 +1074,7 @@ static int netcfInterfaceChangeBegin(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
details ? details : "");
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -1026,7 +1088,7 @@ static int netcfInterfaceChangeCommit(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
if (virInterfaceChangeCommitEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
ret = ncf_change_commit(driver->netcf, 0);
|
|
|
43fe83 |
if (ret < 0) {
|
|
|
43fe83 |
@@ -1038,7 +1100,7 @@ static int netcfInterfaceChangeCommit(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
details ? details : "");
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
@@ -1052,7 +1114,7 @@ static int netcfInterfaceChangeRollback(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
if (virInterfaceChangeRollbackEnsureACL(conn) < 0)
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverLock(driver);
|
|
|
43fe83 |
+ virObjectLock(driver);
|
|
|
43fe83 |
|
|
|
43fe83 |
ret = ncf_change_rollback(driver->netcf, 0);
|
|
|
43fe83 |
if (ret < 0) {
|
|
|
43fe83 |
@@ -1064,13 +1126,13 @@ static int netcfInterfaceChangeRollback(virConnectPtr conn, unsigned int flags)
|
|
|
43fe83 |
details ? details : "");
|
|
|
43fe83 |
}
|
|
|
43fe83 |
|
|
|
43fe83 |
- interfaceDriverUnlock(driver);
|
|
|
43fe83 |
+ virObjectUnlock(driver);
|
|
|
43fe83 |
return ret;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
#endif /* HAVE_NETCF_TRANSACTIONS */
|
|
|
43fe83 |
|
|
|
43fe83 |
static virInterfaceDriver interfaceDriver = {
|
|
|
43fe83 |
- "netcf",
|
|
|
43fe83 |
+ .name = INTERFACE_DRIVER_NAME,
|
|
|
43fe83 |
.interfaceOpen = netcfInterfaceOpen, /* 0.7.0 */
|
|
|
43fe83 |
.interfaceClose = netcfInterfaceClose, /* 0.7.0 */
|
|
|
43fe83 |
.connectNumOfInterfaces = netcfConnectNumOfInterfaces, /* 0.7.0 */
|
|
|
43fe83 |
@@ -1093,11 +1155,19 @@ static virInterfaceDriver interfaceDriver = {
|
|
|
43fe83 |
#endif /* HAVE_NETCF_TRANSACTIONS */
|
|
|
43fe83 |
};
|
|
|
43fe83 |
|
|
|
43fe83 |
+static virStateDriver interfaceStateDriver = {
|
|
|
43fe83 |
+ .name = INTERFACE_DRIVER_NAME,
|
|
|
43fe83 |
+ .stateInitialize = netcfStateInitialize,
|
|
|
43fe83 |
+ .stateCleanup = netcfStateCleanup,
|
|
|
43fe83 |
+ .stateReload = netcfStateReload,
|
|
|
43fe83 |
+};
|
|
|
43fe83 |
+
|
|
|
43fe83 |
int netcfIfaceRegister(void) {
|
|
|
43fe83 |
if (virRegisterInterfaceDriver(&interfaceDriver) < 0) {
|
|
|
43fe83 |
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
43fe83 |
_("failed to register netcf interface driver"));
|
|
|
43fe83 |
return -1;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
+ virRegisterStateDriver(&interfaceStateDriver);
|
|
|
43fe83 |
return 0;
|
|
|
43fe83 |
}
|
|
|
43fe83 |
--
|
|
|
43fe83 |
1.8.3.2
|
|
|
43fe83 |
|