The APIs for allocating/notifying/removing network ports just take
an internal domain interface struct right now. As a step towards
turning these into public facing APIs, add a virNetworkPtr argument
to all of them.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/conf/domain_conf.c | 40 ++++++++++++++++++++----
src/conf/domain_conf.h | 18 +++++++----
src/libxl/libxl_domain.c | 30 +++++++++++++-----
src/libxl/libxl_driver.c | 26 +++++++++++-----
src/lxc/lxc_driver.c | 24 +++++++++++---
src/lxc/lxc_process.c | 24 +++++++++-----
src/network/bridge_driver.c | 54 ++++++++++++++++++--------------
src/qemu/qemu_hotplug.c | 62 +++++++++++++++++++++++++++----------
src/qemu/qemu_process.c | 30 +++++++++++++-----
9 files changed, 223 insertions(+), 85 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b7bb94b90b..22c6fe1e38 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -30184,37 +30184,65 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl
allocate,
}
int
-virDomainNetAllocateActualDevice(virDomainDefPtr dom,
+virDomainNetAllocateActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
+ virNetworkPtr net = NULL;
+ int ret = -1;
+
if (!netAllocate) {
virReportError(VIR_ERR_NO_SUPPORT, "%s",
_("Virtual networking driver is not available"));
return -1;
}
- return netAllocate(dom, iface);
+ if (!(net = virNetworkLookupByName(conn, iface->data.network.name)))
+ return -1;
+
+ ret = netAllocate(net, dom, iface);
+
+ virObjectUnref(net);
+ return ret;
}
void
-virDomainNetNotifyActualDevice(virDomainDefPtr dom,
+virDomainNetNotifyActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
+ virNetworkPtr net = NULL;
+
if (!netNotify)
return;
- netNotify(dom, iface);
+ if (!(net = virNetworkLookupByName(conn, iface->data.network.name)))
+ return;
+
+ netNotify(net, dom, iface);
+
+ virObjectUnref(net);
}
int
-virDomainNetReleaseActualDevice(virDomainDefPtr dom,
+virDomainNetReleaseActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
+ virNetworkPtr net = NULL;
+ int ret;
+
if (!netRelease)
return 0;
- return netRelease(dom, iface);
+ if (!(net = virNetworkLookupByName(conn, iface->data.network.name)))
+ return -1;
+
+ ret = netRelease(net, dom, iface);
+
+ virObjectUnref(net);
+ return ret;
}
bool
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 538fb50b9e..e77fdcabf3 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3505,15 +3505,18 @@ virDomainDefLifecycleActionAllowed(virDomainLifecycle type,
virDomainLifecycleAction action);
typedef int
-(*virDomainNetAllocateActualDeviceImpl)(virDomainDefPtr dom,
+(*virDomainNetAllocateActualDeviceImpl)(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface);
typedef void
-(*virDomainNetNotifyActualDeviceImpl)(virDomainDefPtr dom,
+(*virDomainNetNotifyActualDeviceImpl)(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface);
typedef int
-(*virDomainNetReleaseActualDeviceImpl)(virDomainDefPtr dom,
+(*virDomainNetReleaseActualDeviceImpl)(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface);
typedef bool
@@ -3533,17 +3536,20 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl
allocate,
virDomainNetBandwidthUpdateImpl bandwidthUpdate);
int
-virDomainNetAllocateActualDevice(virDomainDefPtr dom,
+virDomainNetAllocateActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
void
-virDomainNetNotifyActualDevice(virDomainDefPtr dom,
+virDomainNetNotifyActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int
-virDomainNetReleaseActualDevice(virDomainDefPtr dom,
+virDomainNetReleaseActualDevice(virConnectPtr conn,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index e2f1b54210..91b34feca0 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -35,6 +35,7 @@
#include "virtime.h"
#include "locking/domain_lock.h"
#include "xen_common.h"
+#include "driver.h"
#define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -844,6 +845,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
char *file;
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI;
+ virConnectPtr conn = NULL;
#ifdef LIBXL_HAVE_PVUSB
hostdev_flags |= VIR_HOSTDEV_SP_USB;
@@ -903,8 +905,12 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
/* cleanup actual device */
virDomainNetRemoveHostdev(vm->def, net);
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (conn || (conn = virGetConnectNetwork()))
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
+ else
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(net->ifname));
+ }
}
}
@@ -927,6 +933,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
virDomainObjRemoveTransientDef(vm);
virObjectUnref(cfg);
+ virObjectUnref(conn);
}
/*
@@ -1052,6 +1059,8 @@ static int
libxlNetworkPrepareDevices(virDomainDefPtr def)
{
size_t i;
+ virConnectPtr conn = NULL;
+ int ret = -1;
for (i = 0; i < def->nnets; i++) {
virDomainNetDefPtr net = def->nets[i];
@@ -1061,9 +1070,12 @@ libxlNetworkPrepareDevices(virDomainDefPtr def)
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(def, net) < 0)
- return -1;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!conn && !(conn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(conn, def, net) < 0)
+ goto cleanup;
+ }
actualType = virDomainNetGetActualType(net);
if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV &&
@@ -1083,10 +1095,14 @@ libxlNetworkPrepareDevices(virDomainDefPtr def)
pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN;
if (virDomainHostdevInsert(def, hostdev) < 0)
- return -1;
+ goto cleanup;
}
}
- return 0;
+
+ ret = 0;
+ cleanup:
+ virObjectUnref(conn);
+ return ret;
}
static void
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index d5cd3fc834..506dcdfbeb 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -3379,6 +3379,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
libxl_device_nic nic;
int ret = -1;
char mac[VIR_MAC_STRING_BUFLEN];
+ virConnectPtr conn = NULL;
libxl_device_nic_init(&nic);
@@ -3390,9 +3391,12 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(vm->def, net) < 0)
- goto cleanup;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!(conn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(conn, vm->def, net) < 0)
+ goto cleanup;
+ }
actualType = virDomainNetGetActualType(net);
@@ -3441,9 +3445,10 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
vm->def->nets[vm->def->nnets++] = net;
} else {
virDomainNetRemoveHostdev(vm->def, net);
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK && conn)
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
}
+ virObjectUnref(conn);
virObjectUnref(cfg);
return ret;
}
@@ -3865,8 +3870,15 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr driver,
cleanup:
libxl_device_nic_dispose(&nic);
if (!ret) {
- if (detach->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, detach);
+ if (detach->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ virConnectPtr conn = virGetConnectNetwork();
+ if (conn) {
+ virDomainNetReleaseActualDevice(conn, vm->def, detach);
+ virObjectUnref(conn);
+ } else {
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(detach->ifname));
+ }
+ }
virDomainNetRemove(vm->def, detachidx);
}
virObjectUnref(cfg);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 027c4fd990..a184e67e15 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -3834,9 +3834,16 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(vm->def, net) < 0)
- return -1;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ virConnectPtr netconn = virGetConnectNetwork();
+ if (!netconn)
+ return -1;
+ if (virDomainNetAllocateActualDevice(netconn, vm->def, net) < 0) {
+ virObjectUnref(netconn);
+ return -1;
+ }
+ virObjectUnref(netconn);
+ }
actualType = virDomainNetGetActualType(net);
@@ -4389,8 +4396,15 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm,
ret = 0;
cleanup:
if (!ret) {
- if (detach->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, detach);
+ if (detach->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ virConnectPtr conn = virGetConnectNetwork();
+ if (conn) {
+ virDomainNetReleaseActualDevice(conn, vm->def, detach);
+ virObjectUnref(conn);
+ } else {
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(detach->ifname));
+ }
+ }
virDomainNetRemove(vm->def, detachidx);
virDomainNetDefFree(detach);
}
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index 7849aaf5b9..d9362c5ff6 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -165,6 +165,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
virLXCDomainObjPrivatePtr priv = vm->privateData;
virNetDevVPortProfilePtr vport = NULL;
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
+ virConnectPtr conn = NULL;
VIR_DEBUG("Cleanup VM name=%s pid=%d reason=%d",
vm->def->name, (int)vm->pid, (int)reason);
@@ -224,8 +225,12 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
iface->ifname));
ignore_value(virNetDevVethDelete(iface->ifname));
}
- if (iface->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, iface);
+ if (iface->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (conn || (conn = virGetConnectNetwork()))
+ virDomainNetReleaseActualDevice(conn, vm->def, iface);
+ else
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(iface->ifname));
+ }
}
virDomainConfVMNWFilterTeardown(vm);
@@ -543,6 +548,7 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
size_t niface = 0;
virDomainNetDefPtr net;
virDomainNetType type;
+ virConnectPtr netconn = NULL;
if (VIR_ALLOC_N(*veths, def->nnets + 1) < 0)
return -1;
@@ -559,9 +565,12 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
if (virLXCProcessValidateInterface(net) < 0)
goto cleanup;
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(def, net) < 0)
- goto cleanup;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!netconn && !(netconn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(netconn, def, net) < 0)
+ goto cleanup;
+ }
type = virDomainNetGetActualType(net);
switch (type) {
@@ -639,10 +648,11 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
ignore_value(virNetDevOpenvswitchRemovePort(
virDomainNetGetActualBridgeName(iface),
iface->ifname));
- if (iface->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(def, iface);
+ if (iface->type == VIR_DOMAIN_NET_TYPE_NETWORK && netconn)
+ virDomainNetReleaseActualDevice(netconn, def, iface);
}
}
+ virObjectUnref(netconn);
return ret;
}
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index cf37a16c64..abeed0a806 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -4356,7 +4356,8 @@ networkLogAllocation(virNetworkDefPtr netdef,
* Returns 0 on success, -1 on failure.
*/
static int
-networkAllocateActualDevice(virDomainDefPtr dom,
+networkAllocateActualDevice(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
virNetworkDriverStatePtr driver = networkGetDriver();
@@ -4371,6 +4372,14 @@ networkAllocateActualDevice(virDomainDefPtr dom,
size_t i;
int ret = -1;
+ obj = virNetworkObjFindByName(driver->networks, net->name);
+ if (!obj) {
+ virReportError(VIR_ERR_NO_NETWORK,
+ _("no network with matching name '%s'"),
+ net->name);
+ goto error;
+ }
+
if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Expected a interface for a virtual network"));
@@ -4380,13 +4389,6 @@ networkAllocateActualDevice(virDomainDefPtr dom,
virDomainActualNetDefFree(iface->data.network.actual);
iface->data.network.actual = NULL;
- obj = virNetworkObjFindByName(driver->networks, iface->data.network.name);
- if (!obj) {
- virReportError(VIR_ERR_NO_NETWORK,
- _("no network with matching name '%s'"),
- iface->data.network.name);
- goto error;
- }
netdef = virNetworkObjGetDef(obj);
if (!virNetworkObjIsActive(obj)) {
@@ -4775,7 +4777,8 @@ networkAllocateActualDevice(virDomainDefPtr dom,
* No return value (but does log any failures)
*/
static void
-networkNotifyActualDevice(virDomainDefPtr dom,
+networkNotifyActualDevice(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
virNetworkDriverStatePtr driver = networkGetDriver();
@@ -4786,19 +4789,20 @@ networkNotifyActualDevice(virDomainDefPtr dom,
size_t i;
char *master = NULL;
+ obj = virNetworkObjFindByName(driver->networks, net->name);
+ if (!obj) {
+ virReportError(VIR_ERR_NO_NETWORK,
+ _("no network with matching name '%s'"),
+ net->name);
+ goto error;
+ }
+
if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Expected a interface for a virtual network"));
goto error;
}
- obj = virNetworkObjFindByName(driver->networks, iface->data.network.name);
- if (!obj) {
- virReportError(VIR_ERR_NO_NETWORK,
- _("no network with matching name '%s'"),
- iface->data.network.name);
- goto error;
- }
netdef = virNetworkObjGetDef(obj);
if (!virNetworkObjIsActive(obj)) {
@@ -5011,7 +5015,8 @@ networkNotifyActualDevice(virDomainDefPtr dom,
* Returns 0 on success, -1 on failure.
*/
static int
-networkReleaseActualDevice(virDomainDefPtr dom,
+networkReleaseActualDevice(virNetworkPtr net,
+ virDomainDefPtr dom,
virDomainNetDefPtr iface)
{
virNetworkDriverStatePtr driver = networkGetDriver();
@@ -5022,19 +5027,20 @@ networkReleaseActualDevice(virDomainDefPtr dom,
size_t i;
int ret = -1;
+ obj = virNetworkObjFindByName(driver->networks, net->name);
+ if (!obj) {
+ virReportError(VIR_ERR_NO_NETWORK,
+ _("no network with matching name '%s'"),
+ net->name);
+ goto error;
+ }
+
if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Expected a interface for a virtual network"));
goto error;
}
- obj = virNetworkObjFindByName(driver->networks, iface->data.network.name);
- if (!obj) {
- virReportError(VIR_ERR_NO_NETWORK,
- _("no network with matching name '%s'"),
- iface->data.network.name);
- goto error;
- }
netdef = virNetworkObjGetDef(obj);
switch ((virNetworkForwardType) netdef->forward.type) {
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 97c9de04f0..becded57d9 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1374,6 +1374,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
bool charDevPlugged = false;
bool netdevPlugged = false;
char *netdev_name;
+ virConnectPtr conn = NULL;
/* preallocate new slot for device */
if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
@@ -1383,9 +1384,12 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(vm->def, net) < 0)
- goto cleanup;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!(conn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(conn, vm->def, net) < 0)
+ goto cleanup;
+ }
actualType = virDomainNetGetActualType(net);
@@ -1688,8 +1692,12 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
virDomainNetRemoveHostdev(vm->def, net);
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (conn)
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
+ else
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(net->ifname));
+ }
}
VIR_FREE(nicstr);
@@ -1709,6 +1717,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
VIR_FREE(vhostfd);
VIR_FREE(vhostfdName);
VIR_FREE(charDevAlias);
+ virObjectUnref(conn);
virObjectUnref(cfg);
virDomainCCWAddressSetFree(ccwaddrs);
@@ -3719,6 +3728,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
bool needVlanUpdate = false;
int ret = -1;
int changeidx = -1;
+ virConnectPtr conn = NULL;
if ((changeidx = virDomainNetFindIdx(vm->def, newdev)) < 0)
goto cleanup;
@@ -3894,9 +3904,11 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
/* allocate new actual device to compare to old - we will need to
* free it if we fail for any reason
*/
- if (newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(vm->def, newdev) < 0) {
- goto cleanup;
+ if (newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!(conn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(conn, vm->def, newdev) < 0)
+ goto cleanup;
}
newType = virDomainNetGetActualType(newdev);
@@ -4107,8 +4119,12 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
/* this function doesn't work with HOSTDEV networks yet, thus
* no need to change the pointer in the hostdev structure */
- if (olddev->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, olddev);
+ if (olddev->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (conn || (conn = virGetConnectNetwork()))
+ virDomainNetReleaseActualDevice(conn, vm->def, olddev);
+ else
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(olddev->ifname));
+ }
virDomainNetDefFree(olddev);
/* move newdev into the nets list, and NULL it out from the
* virDomainDeviceDef that we were given so that the caller
@@ -4139,8 +4155,8 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
* that the changes were minor enough that we didn't need to
* replace the entire device object.
*/
- if (newdev && newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, newdev);
+ if (newdev && newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
conn)
+ virDomainNetReleaseActualDevice(conn, vm->def, newdev);
return ret;
}
@@ -4697,8 +4713,15 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
virDomainHostdevDefFree(hostdev);
if (net) {
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ virConnectPtr conn = virGetConnectNetwork();
+ if (conn) {
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
+ virObjectUnref(conn);
+ } else {
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(net->ifname));
+ }
+ }
virDomainNetDefFree(net);
}
@@ -4794,8 +4817,15 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver,
qemuDomainNetDeviceVportRemove(net);
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ virConnectPtr conn = virGetConnectNetwork();
+ if (conn) {
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
+ virObjectUnref(conn);
+ } else {
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(net->ifname));
+ }
+ }
virDomainNetDefFree(net);
ret = 0;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 6ec69d3c96..a8b3ed9099 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3266,6 +3266,7 @@ static void
qemuProcessNotifyNets(virDomainDefPtr def)
{
size_t i;
+ virConnectPtr conn = NULL;
for (i = 0; i < def->nnets; i++) {
virDomainNetDefPtr net = def->nets[i];
@@ -3277,9 +3278,14 @@ qemuProcessNotifyNets(virDomainDefPtr def)
if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT)
ignore_value(virNetDevMacVLanReserveName(net->ifname, false));
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetNotifyActualDevice(def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!conn && !(conn = virGetConnectNetwork()))
+ continue;
+ virDomainNetNotifyActualDevice(conn, def, net);
+ }
}
+
+ virObjectUnref(conn);
}
/* Attempt to instantiate the filters. Ignore failures because it's
@@ -5455,6 +5461,7 @@ qemuProcessNetworkPrepareDevices(virDomainDefPtr def)
{
int ret = -1;
size_t i;
+ virConnectPtr conn = NULL;
for (i = 0; i < def->nnets; i++) {
virDomainNetDefPtr net = def->nets[i];
@@ -5464,9 +5471,12 @@ qemuProcessNetworkPrepareDevices(virDomainDefPtr def)
* network's pool of devices, or resolve bridge device name
* to the one defined in the network definition.
*/
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- virDomainNetAllocateActualDevice(def, net) < 0)
- goto cleanup;
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (!conn && !(conn = virGetConnectNetwork()))
+ goto cleanup;
+ if (virDomainNetAllocateActualDevice(conn, def, net) < 0)
+ goto cleanup;
+ }
actualType = virDomainNetGetActualType(net);
if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV &&
@@ -5497,6 +5507,7 @@ qemuProcessNetworkPrepareDevices(virDomainDefPtr def)
}
ret = 0;
cleanup:
+ virObjectUnref(conn);
return ret;
}
@@ -7111,6 +7122,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
size_t i;
char *timestamp;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ virConnectPtr conn = NULL;
VIR_DEBUG("Shutting down vm=%p name=%s id=%d pid=%lld, "
"reason=%s, asyncJob=%s, flags=0x%x",
@@ -7311,8 +7323,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
/* kick the device out of the hostdev list too */
virDomainNetRemoveHostdev(def, net);
- if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK)
- virDomainNetReleaseActualDevice(vm->def, net);
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (conn || (conn = virGetConnectNetwork()))
+ virDomainNetReleaseActualDevice(conn, vm->def, net);
+ else
+ VIR_WARN("Unable to release network device '%s'",
NULLSTR(net->ifname));
+ }
}
retry:
--
2.20.1