From nobody Sun Feb 8 15:29:26 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1545663598163459.13496623621745; Mon, 24 Dec 2018 06:59:58 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4EE445F797; Mon, 24 Dec 2018 14:59:56 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 15B6B197FA; Mon, 24 Dec 2018 14:59:56 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id C499A1888CE6; Mon, 24 Dec 2018 14:59:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wBOExPU6000759 for ; Mon, 24 Dec 2018 09:59:26 -0500 Received: by smtp.corp.redhat.com (Postfix) id ED89260C6D; Mon, 24 Dec 2018 14:59:25 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-112-27.ams2.redhat.com [10.36.112.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id CA74960C66; Mon, 24 Dec 2018 14:59:24 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Mon, 24 Dec 2018 14:58:51 +0000 Message-Id: <20181224145915.8700-4-berrange@redhat.com> In-Reply-To: <20181224145915.8700-1-berrange@redhat.com> References: <20181224145915.8700-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 03/27] network: pass a virNetworkPtr to port management APIs X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 24 Dec 2018 14:59:57 +0000 (UTC) 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=C3=A9 --- 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 | 27 ++++++++++------ src/network/bridge_driver.c | 54 ++++++++++++++++++-------------- src/qemu/qemu_hotplug.c | 62 +++++++++++++++++++++++++++---------- src/qemu/qemu_process.c | 30 +++++++++++++----- 9 files changed, 223 insertions(+), 88 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a3b539ccaa..3320a03572 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -30473,37 +30473,65 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateAct= ualDeviceImpl allocate, } =20 int -virDomainNetAllocateActualDevice(virDomainDefPtr dom, +virDomainNetAllocateActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) { + virNetworkPtr net =3D NULL; + int ret =3D -1; + if (!netAllocate) { virReportError(VIR_ERR_NO_SUPPORT, "%s", _("Virtual networking driver is not available")); return -1; } =20 - return netAllocate(dom, iface); + if (!(net =3D virNetworkLookupByName(conn, iface->data.network.name))) + return -1; + + ret =3D netAllocate(net, dom, iface); + + virObjectUnref(net); + return ret; } =20 void -virDomainNetNotifyActualDevice(virDomainDefPtr dom, +virDomainNetNotifyActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) { + virNetworkPtr net =3D NULL; + if (!netNotify) return; =20 - netNotify(dom, iface); + if (!(net =3D virNetworkLookupByName(conn, iface->data.network.name))) + return; + + netNotify(net, dom, iface); + + virObjectUnref(net); } =20 =20 int -virDomainNetReleaseActualDevice(virDomainDefPtr dom, +virDomainNetReleaseActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) { + virNetworkPtr net =3D NULL; + int ret; + if (!netRelease) return 0; =20 - return netRelease(dom, iface); + if (!(net =3D virNetworkLookupByName(conn, iface->data.network.name))) + return -1; + + ret =3D netRelease(net, dom, iface); + + virObjectUnref(net); + return ret; } =20 bool diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5814997bdb..e611457314 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3600,15 +3600,18 @@ virDomainDefLifecycleActionAllowed(virDomainLifecyc= le type, virDomainLifecycleAction action); =20 typedef int -(*virDomainNetAllocateActualDeviceImpl)(virDomainDefPtr dom, +(*virDomainNetAllocateActualDeviceImpl)(virNetworkPtr net, + virDomainDefPtr dom, virDomainNetDefPtr iface); =20 typedef void -(*virDomainNetNotifyActualDeviceImpl)(virDomainDefPtr dom, +(*virDomainNetNotifyActualDeviceImpl)(virNetworkPtr net, + virDomainDefPtr dom, virDomainNetDefPtr iface); =20 typedef int -(*virDomainNetReleaseActualDeviceImpl)(virDomainDefPtr dom, +(*virDomainNetReleaseActualDeviceImpl)(virNetworkPtr net, + virDomainDefPtr dom, virDomainNetDefPtr iface); =20 typedef bool @@ -3628,17 +3631,20 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActua= lDeviceImpl allocate, virDomainNetBandwidthUpdateImpl bandwidthUpdate); =20 int -virDomainNetAllocateActualDevice(virDomainDefPtr dom, +virDomainNetAllocateActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 void -virDomainNetNotifyActualDevice(virDomainDefPtr dom, +virDomainNetNotifyActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 int -virDomainNetReleaseActualDevice(virDomainDefPtr dom, +virDomainNetReleaseActualDevice(virConnectPtr conn, + virDomainDefPtr dom, virDomainNetDefPtr iface) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); =20 diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index e595e552b0..ddb64083b1 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" =20 #define VIR_FROM_THIS VIR_FROM_LIBXL =20 @@ -839,6 +840,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, char *file; virHostdevManagerPtr hostdev_mgr =3D driver->hostdevMgr; unsigned int hostdev_flags =3D VIR_HOSTDEV_SP_PCI; + virConnectPtr conn =3D NULL; =20 #ifdef LIBXL_HAVE_PVUSB hostdev_flags |=3D VIR_HOSTDEV_SP_USB; @@ -898,8 +900,12 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, =20 /* cleanup actual device */ virDomainNetRemoveHostdev(vm->def, net); - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn || (conn =3D virGetConnectNetwork())) + virDomainNetReleaseActualDevice(conn, vm->def, net); + else + VIR_WARN("Unable to release network device '%s'", NULL= STR(net->ifname)); + } } } =20 @@ -922,6 +928,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, =20 virDomainObjRemoveTransientDef(vm); virObjectUnref(cfg); + virObjectUnref(conn); } =20 /* @@ -1047,6 +1054,8 @@ static int libxlNetworkPrepareDevices(virDomainDefPtr def) { size_t i; + virConnectPtr conn =3D NULL; + int ret =3D -1; =20 for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; @@ -1056,9 +1065,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(def, net) < 0) - return -1; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!conn && !(conn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(conn, def, net) < 0) + goto cleanup; + } =20 actualType =3D virDomainNetGetActualType(net); if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && @@ -1078,10 +1090,14 @@ libxlNetworkPrepareDevices(virDomainDefPtr def) pcisrc->backend =3D VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; =20 if (virDomainHostdevInsert(def, hostdev) < 0) - return -1; + goto cleanup; } } - return 0; + + ret =3D 0; + cleanup: + virObjectUnref(conn); + return ret; } =20 static void diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d702873892..faebb40d31 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3385,6 +3385,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driv= er, libxl_device_nic nic; int ret =3D -1; char mac[VIR_MAC_STRING_BUFLEN]; + virConnectPtr conn =3D NULL; =20 libxl_device_nic_init(&nic); =20 @@ -3396,9 +3397,12 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr dri= ver, * network's pool of devices, or resolve bridge device name * to the one defined in the network definition. */ - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(vm->def, net) < 0) - goto cleanup; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!(conn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(conn, vm->def, net) < 0) + goto cleanup; + } =20 actualType =3D virDomainNetGetActualType(net); =20 @@ -3447,9 +3451,10 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr dri= ver, vm->def->nets[vm->def->nnets++] =3D net; } else { virDomainNetRemoveHostdev(vm->def, net); - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && conn) + virDomainNetReleaseActualDevice(conn, vm->def, net); } + virObjectUnref(conn); virObjectUnref(cfg); return ret; } @@ -3871,8 +3876,15 @@ libxlDomainDetachNetDevice(libxlDriverPrivatePtr dri= ver, cleanup: libxl_device_nic_dispose(&nic); if (!ret) { - if (detach->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, detach); + if (detach->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virConnectPtr conn =3D 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 a5eaf12ce1..f4138a0e10 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3867,9 +3867,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(vm->def, net) < 0) - return -1; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virConnectPtr netconn =3D virGetConnectNetwork(); + if (!netconn) + return -1; + if (virDomainNetAllocateActualDevice(netconn, vm->def, net) < 0) { + virObjectUnref(netconn); + return -1; + } + virObjectUnref(netconn); + } =20 actualType =3D virDomainNetGetActualType(net); =20 @@ -4422,8 +4429,15 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm, ret =3D 0; cleanup: if (!ret) { - if (detach->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, detach); + if (detach->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virConnectPtr conn =3D 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 7a6b40d9b8..cff67985e5 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -165,6 +165,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, virLXCDomainObjPrivatePtr priv =3D vm->privateData; virNetDevVPortProfilePtr vport =3D NULL; virLXCDriverConfigPtr cfg =3D virLXCDriverGetConfig(driver); + virConnectPtr conn =3D NULL; =20 VIR_DEBUG("Cleanup VM name=3D%s pid=3D%d reason=3D%d", vm->def->name, (int)vm->pid, (int)reason); @@ -213,8 +214,12 @@ static void virLXCProcessCleanup(virLXCDriverPtr drive= r, iface->ifname)); ignore_value(virNetDevVethDelete(iface->ifname)); } - if (iface->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, iface); + if (iface->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn || (conn =3D virGetConnectNetwork())) + virDomainNetReleaseActualDevice(conn, vm->def, iface); + else + VIR_WARN("Unable to release network device '%s'", NULLSTR(= iface->ifname)); + } } =20 virDomainConfVMNWFilterTeardown(vm); @@ -532,6 +537,7 @@ static int virLXCProcessSetupInterfaces(virConnectPtr c= onn, size_t niface =3D 0; virDomainNetDefPtr net; virDomainNetType type; + virConnectPtr netconn =3D NULL; =20 if (VIR_ALLOC_N(*veths, def->nnets + 1) < 0) return -1; @@ -548,12 +554,12 @@ static int virLXCProcessSetupInterfaces(virConnectPtr= conn, if (virLXCProcessValidateInterface(net) < 0) goto cleanup; =20 - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(def, net) < 0) - goto cleanup; - - if (virDomainNetAllocateActualDevice(def, net) < 0) - goto cleanup; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!netconn && !(netconn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(netconn, def, net) < 0) + goto cleanup; + } =20 type =3D virDomainNetGetActualType(net); switch (type) { @@ -631,10 +637,11 @@ static int virLXCProcessSetupInterfaces(virConnectPtr= conn, ignore_value(virNetDevOpenvswitchRemovePort( virDomainNetGetActualBridgeName(iface), iface->ifname)); - if (iface->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(def, iface); + if (iface->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && netconn) + virDomainNetReleaseActualDevice(netconn, def, iface); } } + virObjectUnref(netconn); return ret; } =20 diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 6555a020aa..f3cdf40bfb 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -4437,7 +4437,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 =3D networkGetDriver(); @@ -4452,6 +4453,14 @@ networkAllocateActualDevice(virDomainDefPtr dom, size_t i; int ret =3D -1; =20 + obj =3D 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 !=3D VIR_DOMAIN_NET_TYPE_NETWORK) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Expected a interface for a virtual network")); @@ -4461,13 +4470,6 @@ networkAllocateActualDevice(virDomainDefPtr dom, virDomainActualNetDefFree(iface->data.network.actual); iface->data.network.actual =3D NULL; =20 - obj =3D 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 =3D virNetworkObjGetDef(obj); =20 if (!virNetworkObjIsActive(obj)) { @@ -4856,7 +4858,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 =3D networkGetDriver(); @@ -4867,19 +4870,20 @@ networkNotifyActualDevice(virDomainDefPtr dom, size_t i; char *master =3D NULL; =20 + obj =3D 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 !=3D VIR_DOMAIN_NET_TYPE_NETWORK) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Expected a interface for a virtual network")); goto error; } =20 - obj =3D 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 =3D virNetworkObjGetDef(obj); =20 if (!virNetworkObjIsActive(obj)) { @@ -5092,7 +5096,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 =3D networkGetDriver(); @@ -5103,19 +5108,20 @@ networkReleaseActualDevice(virDomainDefPtr dom, size_t i; int ret =3D -1; =20 + obj =3D 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 !=3D VIR_DOMAIN_NET_TYPE_NETWORK) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Expected a interface for a virtual network")); goto error; } =20 - obj =3D 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 =3D virNetworkObjGetDef(obj); =20 switch ((virNetworkForwardType) netdef->forward.type) { diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 663a59b0b3..575c5854d3 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1327,6 +1327,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, bool charDevPlugged =3D false; bool netdevPlugged =3D false; char *netdev_name; + virConnectPtr conn =3D NULL; =20 /* preallocate new slot for device */ if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0) @@ -1336,9 +1337,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(vm->def, net) < 0) - goto cleanup; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!(conn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(conn, vm->def, net) < 0) + goto cleanup; + } =20 actualType =3D virDomainNetGetActualType(net); =20 @@ -1641,8 +1645,12 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, =20 virDomainNetRemoveHostdev(vm->def, net); =20 - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn) + virDomainNetReleaseActualDevice(conn, vm->def, net); + else + VIR_WARN("Unable to release network device '%s'", NULLSTR(= net->ifname)); + } } =20 VIR_FREE(nicstr); @@ -1662,6 +1670,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, VIR_FREE(vhostfd); VIR_FREE(vhostfdName); VIR_FREE(charDevAlias); + virObjectUnref(conn); virObjectUnref(cfg); virDomainCCWAddressSetFree(ccwaddrs); =20 @@ -3664,6 +3673,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, bool needVlanUpdate =3D false; int ret =3D -1; int changeidx =3D -1; + virConnectPtr conn =3D NULL; =20 if ((changeidx =3D virDomainNetFindIdx(vm->def, newdev)) < 0) goto cleanup; @@ -3839,9 +3849,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(vm->def, newdev) < 0) { - goto cleanup; + if (newdev->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!(conn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(conn, vm->def, newdev) < 0) + goto cleanup; } =20 newType =3D virDomainNetGetActualType(newdev); @@ -4052,8 +4064,12 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, =20 /* this function doesn't work with HOSTDEV networks yet, thus * no need to change the pointer in the hostdev structure */ - if (olddev->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, olddev); + if (olddev->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn || (conn =3D 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 @@ -4084,8 +4100,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, newdev); + if (newdev && newdev->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && conn) + virDomainNetReleaseActualDevice(conn, vm->def, newdev); =20 return ret; } @@ -4642,8 +4658,15 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainHostdevDefFree(hostdev); =20 if (net) { - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virConnectPtr conn =3D virGetConnectNetwork(); + if (conn) { + virDomainNetReleaseActualDevice(conn, vm->def, net); + virObjectUnref(conn); + } else { + VIR_WARN("Unable to release network device '%s'", NULLSTR(= net->ifname)); + } + } virDomainNetDefFree(net); } =20 @@ -4739,8 +4762,15 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver, =20 qemuDomainNetDeviceVportRemove(net); =20 - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + virConnectPtr conn =3D 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 =3D 0; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d9baff587e..5597436fba 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3185,6 +3185,7 @@ static void qemuProcessNotifyNets(virDomainDefPtr def) { size_t i; + virConnectPtr conn =3D NULL; =20 for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; @@ -3196,9 +3197,14 @@ qemuProcessNotifyNets(virDomainDefPtr def) if (virDomainNetGetActualType(net) =3D=3D VIR_DOMAIN_NET_TYPE_DIRE= CT) ignore_value(virNetDevMacVLanReserveName(net->ifname, false)); =20 - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetNotifyActualDevice(def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!conn && !(conn =3D virGetConnectNetwork())) + continue; + virDomainNetNotifyActualDevice(conn, def, net); + } } + + virObjectUnref(conn); } =20 /* Attempt to instantiate the filters. Ignore failures because it's @@ -5377,6 +5383,7 @@ qemuProcessNetworkPrepareDevices(virDomainDefPtr def) { int ret =3D -1; size_t i; + virConnectPtr conn =3D NULL; =20 for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; @@ -5386,9 +5393,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 =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && - virDomainNetAllocateActualDevice(def, net) < 0) - goto cleanup; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!conn && !(conn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(conn, def, net) < 0) + goto cleanup; + } =20 actualType =3D virDomainNetGetActualType(net); if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && @@ -5419,6 +5429,7 @@ qemuProcessNetworkPrepareDevices(virDomainDefPtr def) } ret =3D 0; cleanup: + virObjectUnref(conn); return ret; } =20 @@ -7027,6 +7038,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, size_t i; char *timestamp; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); + virConnectPtr conn =3D NULL; =20 VIR_DEBUG("Shutting down vm=3D%p name=3D%s id=3D%d pid=3D%lld, " "reason=3D%s, asyncJob=3D%s, flags=3D0x%x", @@ -7227,8 +7239,12 @@ void qemuProcessStop(virQEMUDriverPtr driver, =20 /* kick the device out of the hostdev list too */ virDomainNetRemoveHostdev(def, net); - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) - virDomainNetReleaseActualDevice(vm->def, net); + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn || (conn =3D virGetConnectNetwork())) + virDomainNetReleaseActualDevice(conn, vm->def, net); + else + VIR_WARN("Unable to release network device '%s'", NULLSTR(= net->ifname)); + } } =20 retry: --=20 2.19.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list