From caed469ef5a53de2305760f0e4ebf5d90f0d26ad Mon Sep 17 00:00:00 2001 From: Jim Fehlig <jfehlig@suse.com> Date: Wed, 17 Feb 2021 15:24:58 -0700 Subject: [PATCH] libxl: Add a helper function to unprepare network devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move network device cleanup code from libxlDomainCleanup to a helper function for use in a subsequent patch. Signed-off-by: Jim Fehlig <jfehlig@suse.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- src/libxl/libxl_domain.c | 50 ++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index e906495b64..513621f6dd 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -826,6 +826,33 @@ libxlDomainSaveImageOpen(libxlDriverPrivate *driver, return -1; } +static void +libxlNetworkUnwindDevices(virDomainDef *def) +{ + if (def->nnets) { + size_t i; + + for (i = 0; i < def->nnets; i++) { + virDomainNetDef *net = def->nets[i]; + + if (net->ifname && + STRPREFIX(net->ifname, LIBXL_GENERATED_PREFIX_XEN)) + VIR_FREE(net->ifname); + + /* cleanup actual device */ + virDomainNetRemoveHostdev(def, net); + if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + g_autoptr(virConnect) conn = virGetConnectNetwork(); + + if (conn) + virDomainNetReleaseActualDevice(conn, def, net); + else + VIR_WARN("Unable to release network device '%s'", NULLSTR(net->ifname)); + } + } + } +} + /* * Internal domain destroy function. * @@ -870,7 +897,6 @@ libxlDomainCleanup(libxlDriverPrivate *driver, char *file; virHostdevManager *hostdev_mgr = driver->hostdevMgr; unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI; - g_autoptr(virConnect) conn = NULL; VIR_DEBUG("Cleaning up domain with id '%d' and name '%s'", vm->def->id, vm->def->name); @@ -923,29 +949,9 @@ libxlDomainCleanup(libxlDriverPrivate *driver, } } - if ((vm->def->nnets)) { - size_t i; - - for (i = 0; i < vm->def->nnets; i++) { - virDomainNetDef *net = vm->def->nets[i]; - - if (net->ifname && - STRPREFIX(net->ifname, LIBXL_GENERATED_PREFIX_XEN)) - VIR_FREE(net->ifname); - - /* cleanup actual device */ - virDomainNetRemoveHostdev(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)); - } - } - } + libxlNetworkUnwindDevices(vm->def); file = g_strdup_printf("%s/%s.xml", cfg->stateDir, vm->def->name); - if (unlink(file) < 0 && errno != ENOENT && errno != ENOTDIR) VIR_DEBUG("Failed to remove domain XML for %s", vm->def->name); VIR_FREE(file);