Fix migration failure occurring with VIR_DOMAIN_XML_MIGRATABLE (bz #1075174)

remotes/origin/f20
Cole Robinson 2014-03-18 14:47:14 -04:00
parent 2b7e43f135
commit 9cd81dde07
2 changed files with 145 additions and 1 deletions

View File

@ -0,0 +1,135 @@
From ddbaa2a562b53ec3eb99820217df4d721ebfdefe Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
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 <mprivozn@redhat.com>
(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;
}

View File

@ -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 <crobinso@redhat.com> - 1.1.3.4-4
- Fix migration failure occurring with VIR_DOMAIN_XML_MIGRATABLE (bz #1075174)
* Mon Mar 10 2014 Cole Robinson <crobinso@redhat.com> - 1.1.3.4-3
- Escape XML characters in volume XML (bz #1074528)