diff --git a/0007-qemu-Introduce-qemuDomainDefCheckABIStability.patch b/0007-qemu-Introduce-qemuDomainDefCheckABIStability.patch new file mode 100644 index 0000000..5cafe6d --- /dev/null +++ b/0007-qemu-Introduce-qemuDomainDefCheckABIStability.patch @@ -0,0 +1,135 @@ +From ddbaa2a562b53ec3eb99820217df4d721ebfdefe Mon Sep 17 00:00:00 2001 +From: Michal Privoznik +Date: Thu, 10 Oct 2013 10:53:56 +0200 +Subject: [PATCH] qemu: Introduce qemuDomainDefCheckABIStability + +https://bugzilla.redhat.com/show_bug.cgi?id=994364 + +Whenever we check for ABI stability, we have new xml (e.g. provided by +user, or obtained from snapshot, whatever) which we compare to old xml +and see if ABI won't break. However, if the new xml was produced via +virDomainGetXMLDesc(..., VIR_DOMAIN_XML_MIGRATABLE) it lacks some +devices, e.g. 'pci-root' controller. Hence, the ABI stability check +fails even though it is stable. Moreover, we can't simply fix +virDomainDefCheckABIStability because removing the correct devices is +task for the driver. For instance, qemu driver wants to remove the usb +controller too, while LXC driver doesn't. That's why we need special +qemu wrapper over virDomainDefCheckABIStability which removes the +correct devices from domain XML, produces MIGRATABLE xml and calls the +check ABI stability function. + +Signed-off-by: Michal Privoznik +(cherry picked from commit 7d704812b9c50cd3804dd1e7f9e2ea3e75fdc847) +--- + src/qemu/qemu_domain.c | 22 ++++++++++++++++++++++ + src/qemu/qemu_domain.h | 3 +++ + src/qemu/qemu_driver.c | 10 ++-------- + src/qemu/qemu_migration.c | 4 ++-- + 4 files changed, 29 insertions(+), 10 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 968e323..f3e2ba1 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -2342,3 +2342,25 @@ qemuDomainUpdateDeviceList(virQEMUDriverPtr driver, + priv->qemuDevices = aliases; + return 0; + } ++ ++bool ++qemuDomainDefCheckABIStability(virQEMUDriverPtr driver, ++ virDomainDefPtr src, ++ virDomainDefPtr dst) ++{ ++ virDomainDefPtr migratableDefSrc = NULL; ++ virDomainDefPtr migratableDefDst = NULL; ++ const int flags = VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE; ++ bool ret = false; ++ ++ if (!(migratableDefSrc = qemuDomainDefCopy(driver, src, flags)) || ++ !(migratableDefDst = qemuDomainDefCopy(driver, dst, flags))) ++ goto cleanup; ++ ++ ret = virDomainDefCheckABIStability(migratableDefSrc, migratableDefDst); ++ ++cleanup: ++ virDomainDefFree(migratableDefSrc); ++ virDomainDefFree(migratableDefDst); ++ return ret; ++} +diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h +index 04f08a3..77e0c20 100644 +--- a/src/qemu/qemu_domain.h ++++ b/src/qemu/qemu_domain.h +@@ -369,4 +369,7 @@ extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig; + int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver, + virDomainObjPtr vm); + ++bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver, ++ virDomainDefPtr src, ++ virDomainDefPtr dst); + #endif /* __QEMU_DOMAIN_H__ */ +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 58be308..d7f92f4 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -3085,7 +3085,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom, + VIR_DOMAIN_XML_INACTIVE))) { + goto endjob; + } +- if (!virDomainDefCheckABIStability(vm->def, def)) { ++ if (!qemuDomainDefCheckABIStability(driver, vm->def, def)) { + virDomainDefFree(def); + goto endjob; + } +@@ -13030,7 +13030,6 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, + qemuDomainObjPrivatePtr priv; + int rc; + virDomainDefPtr config = NULL; +- virDomainDefPtr migratableDef = NULL; + virQEMUDriverConfigPtr cfg = NULL; + virCapsPtr caps = NULL; + +@@ -13147,11 +13146,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, + /* Transitions 5, 6, 8, 9 */ + /* Check for ABI compatibility. We need to do this check against + * the migratable XML or it will always fail otherwise */ +- if (!(migratableDef = qemuDomainDefCopy(driver, vm->def, +- VIR_DOMAIN_XML_MIGRATABLE))) +- goto cleanup; +- +- if (config && !virDomainDefCheckABIStability(migratableDef, config)) { ++ if (config && !qemuDomainDefCheckABIStability(driver, vm->def, config)) { + virErrorPtr err = virGetLastError(); + + if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) { +@@ -13356,7 +13351,6 @@ cleanup: + } + if (vm) + virObjectUnlock(vm); +- virDomainDefFree(migratableDef); + virObjectUnref(caps); + virObjectUnref(cfg); + +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index 58f90c2..2db5ed0 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -2043,7 +2043,7 @@ static char + VIR_DOMAIN_XML_INACTIVE))) + goto cleanup; + +- if (!virDomainDefCheckABIStability(vm->def, def)) ++ if (!qemuDomainDefCheckABIStability(driver, vm->def, def)) + goto cleanup; + + rv = qemuDomainDefFormatLive(driver, def, false, true); +@@ -2250,7 +2250,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, + if (!newdef) + goto cleanup; + +- if (!virDomainDefCheckABIStability(*def, newdef)) { ++ if (!qemuDomainDefCheckABIStability(driver, *def, newdef)) { + virDomainDefFree(newdef); + goto cleanup; + } diff --git a/libvirt.spec b/libvirt.spec index f63aa7b..9801976 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -367,7 +367,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 1.1.3.4 -Release: 3%{?dist}%{?extra_release} +Release: 4%{?dist}%{?extra_release} License: LGPLv2+ Group: Development/Libraries BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root @@ -386,6 +386,9 @@ Patch0004: 0004-virNetServerRun-Notify-systemd-that-we-re-accepting-.patch # Escape XML characters in volume XML (bz #1074528) Patch0005: 0005-maint-fix-comma-style-issues-conf.patch Patch0006: 0006-storage-use-valid-XML-for-awkward-volume-names.patch +# Fix migration failure occurring with VIR_DOMAIN_XML_MIGRATABLE (bz +# #1075174) +Patch0007: 0007-qemu-Introduce-qemuDomainDefCheckABIStability.patch %if %{with_libvirtd} Requires: libvirt-daemon = %{version}-%{release} @@ -1178,6 +1181,9 @@ of recent versions of Linux (and other OSes). # Escape XML characters in volume XML (bz #1074528) %patch0005 -p1 %patch0006 -p1 +# Fix migration failure occurring with VIR_DOMAIN_XML_MIGRATABLE (bz +# #1075174) +%patch0007 -p1 %build %if ! %{with_xen} @@ -2136,6 +2142,9 @@ fi %endif %changelog +* Tue Mar 18 2014 Cole Robinson - 1.1.3.4-4 +- Fix migration failure occurring with VIR_DOMAIN_XML_MIGRATABLE (bz #1075174) + * Mon Mar 10 2014 Cole Robinson - 1.1.3.4-3 - Escape XML characters in volume XML (bz #1074528)