[PATCH] libxl: free ifname on migration begin phase

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Commit d2e5538b1 changes virDomainDef to create ifnames
that are autogenerated by libxl, and also clearing them up
on domain cleanup. One place that was missing was also
on migration, when domain xml is sent to dst libvirtd and
would contain ifnames from the source libvirtd. This
would lead to erronous behaviour (as seen in osstest CI)
such as failing to migrate when a vif with the a name
that existed on the destination host (belonging to another domain).

This patch adds an helper libxlDomainFreeIfaceNames for
freeing autogenerated ifnames on both migration begin phase
and domain cleanup.

Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
---
 src/libxl/libxl_domain.c    | 32 ++++++++++++++++++++++----------
 src/libxl/libxl_domain.h    |  3 +++
 src/libxl/libxl_migration.c |  2 ++
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index ef92974..487589d 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -728,16 +728,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
         }
     }
 
-    if ((vm->def->nnets)) {
-        size_t i;
-
-        for (i = 0; i < vm->def->nnets; i++) {
-            virDomainNetDefPtr net = vm->def->nets[i];
-
-            if (STRPREFIX(net->ifname, "vif"))
-                VIR_FREE(net->ifname);
-        }
-    }
+    libxlDomainFreeIfaceNames(vm->def);
 
     if (virAsprintf(&file, "%s/%s.xml", cfg->stateDir, vm->def->name) > 0) {
         if (unlink(file) < 0 && errno != ENOENT && errno != ENOTDIR)
@@ -923,6 +914,27 @@ libxlDomainCreateIfaceNames(virDomainDefPtr def, libxl_domain_config *d_config)
     }
 }
 
+/*
+ * Removes autogenerated interface names for the network devices in
+ * parameter def. User-provided interface names are skipped.
+ */
+void
+libxlDomainFreeIfaceNames(virDomainDefPtr def)
+{
+    size_t i;
+
+    for (i = 0; i < def->nnets; i++) {
+        virDomainNetDefPtr net = def->nets[i];
+
+        if (!net->ifname)
+            continue;
+
+        if (STRPREFIX(net->ifname, "vif"))
+            VIR_FREE(net->ifname);
+    }
+}
+
+
 
 /*
  * Start a domain through libxenlight.
diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
index 44b3e0b..70c139c 100644
--- a/src/libxl/libxl_domain.h
+++ b/src/libxl/libxl_domain.h
@@ -135,6 +135,9 @@ int
 libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver,
                              virDomainObjPtr vm);
 
+void
+libxlDomainFreeIfaceNames(virDomainDefPtr def);
+
 int
 libxlDomainStart(libxlDriverPrivatePtr driver,
                  virDomainObjPtr vm,
diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c
index 0d23e5f..1ee19ae 100644
--- a/src/libxl/libxl_migration.c
+++ b/src/libxl/libxl_migration.c
@@ -249,6 +249,8 @@ libxlDomainMigrationBegin(virConnectPtr conn,
         def = tmpdef;
     } else {
         def = vm->def;
+
+        libxlDomainFreeIfaceNames(def);
     }
 
     if (!libxlDomainMigrationIsAllowed(def))
-- 
2.1.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]