diff --git a/0001-schema-interleave-domain-name-and-uuid-with-other-el.patch b/0001-schema-interleave-domain-name-and-uuid-with-other-el.patch new file mode 100644 index 0000000..0033803 --- /dev/null +++ b/0001-schema-interleave-domain-name-and-uuid-with-other-el.patch @@ -0,0 +1,38 @@ +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Thu, 17 Dec 2015 13:43:58 +0100 +Subject: [PATCH] schema: interleave domain name and uuid with other elements +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Allow and anywhere under , not just at the top: + +error:XML document failed to validate against schema: Unable to validate +doc against /usr/share/libvirt/schemas/domain.rng +Expecting an element name, got nothing +Invalid sequence in interleave +Element domain failed to validate content + +Introduced with the first RelaxNG schema in commit c642103. + +https://bugzilla.redhat.com/show_bug.cgi?id=1292131 +(cherry picked from commit b4e0549febe416ffefc16f389423740d6d65fa74) +Signed-off-by: Ján Tomko +--- + docs/schemas/domaincommon.rng | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng +index 1120003..9e7fad5 100644 +--- a/docs/schemas/domaincommon.rng ++++ b/docs/schemas/domaincommon.rng +@@ -30,8 +30,8 @@ + + + +- + ++ + + + diff --git a/0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch b/0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch new file mode 100644 index 0000000..d9c290b --- /dev/null +++ b/0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch @@ -0,0 +1,32 @@ +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Thu, 14 Jan 2016 14:31:17 +0100 +Subject: [PATCH] leaseshelper: fix crash when no mac is specified +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If dnsmasq specified DNSMASQ_IAID (so we're dealing with an IPv6 +lease) but no DNSMASQ_MAC, we skip creation of the new lease object. + +Also skip adding it to the leases array. + +https://bugzilla.redhat.com/show_bug.cgi?id=1202350 +(cherry picked from commit df9fe124d650bc438c531673492569da87523d20) +Signed-off-by: Ján Tomko +--- + src/network/leaseshelper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c +index 2d528f7..6930310 100644 +--- a/src/network/leaseshelper.c ++++ b/src/network/leaseshelper.c +@@ -439,7 +439,7 @@ main(int argc, char **argv) + + case VIR_LEASE_ACTION_OLD: + case VIR_LEASE_ACTION_ADD: +- if (virJSONValueArrayAppend(leases_array_new, lease_new) < 0) { ++ if (lease_new && virJSONValueArrayAppend(leases_array_new, lease_new) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to create json")); + goto cleanup; diff --git a/0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch b/0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch new file mode 100644 index 0000000..bbe1330 --- /dev/null +++ b/0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch @@ -0,0 +1,63 @@ +From: Cole Robinson +Date: Tue, 19 Jan 2016 22:19:56 -0500 +Subject: [PATCH] build: predictably generate systemtap tapsets (bz 1173641) + +The generated output is dependent on perl hashtable ordering, which +gives different results for i686 and x86_64. Fix this by sorting +the hash keys before iterating over them + +https://bugzilla.redhat.com/show_bug.cgi?id=1173641 +(cherry picked from commit a1edb05c6028470aa24b74aa0f8d5fb5a181128a) +--- + src/rpc/gensystemtap.pl | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/src/rpc/gensystemtap.pl b/src/rpc/gensystemtap.pl +index 2467300..7b80fbf 100755 +--- a/src/rpc/gensystemtap.pl ++++ b/src/rpc/gensystemtap.pl +@@ -72,7 +72,7 @@ function libvirt_rpc_auth_name(type, verbose) + { + EOF + my $first = 1; +-foreach my $type (keys %auth) { ++foreach my $type (sort(keys %auth)) { + my $cond = $first ? "if" : "} else if"; + $first = 0; + print " $cond (type == ", $type, ") {\n"; +@@ -95,7 +95,7 @@ function libvirt_rpc_type_name(type, verbose) + { + EOF + $first = 1; +-foreach my $type (keys %type) { ++foreach my $type (sort(keys %type)) { + my $cond = $first ? "if" : "} else if"; + $first = 0; + print " $cond (type == ", $type, ") {\n"; +@@ -118,7 +118,7 @@ function libvirt_rpc_status_name(status, verbose) + { + EOF + $first = 1; +-foreach my $status (keys %status) { ++foreach my $status (sort(keys %status)) { + my $cond = $first ? "if" : "} else if"; + $first = 0; + print " $cond (status == ", $status, ") {\n"; +@@ -141,7 +141,7 @@ function libvirt_rpc_program_name(program, verbose) + { + EOF + $first = 1; +-foreach my $prog (keys %funcs) { ++foreach my $prog (sort(keys %funcs)) { + my $cond = $first ? "if" : "} else if"; + $first = 0; + print " $cond (program == ", $funcs{$prog}->{id}, ") {\n"; +@@ -165,7 +165,7 @@ function libvirt_rpc_procedure_name(program, version, proc, verbose) + { + EOF + $first = 1; +-foreach my $prog (keys %funcs) { ++foreach my $prog (sort(keys %funcs)) { + my $cond = $first ? "if" : "} else if"; + $first = 0; + print " $cond (program == ", $funcs{$prog}->{id}, " && version == ", $funcs{$prog}->{version}, ") {\n"; diff --git a/0004-rpc-socket-Minor-cleanups.patch b/0004-rpc-socket-Minor-cleanups.patch new file mode 100644 index 0000000..f7461b9 --- /dev/null +++ b/0004-rpc-socket-Minor-cleanups.patch @@ -0,0 +1,48 @@ +From: Cole Robinson +Date: Mon, 11 Jan 2016 20:01:24 -0500 +Subject: [PATCH] rpc: socket: Minor cleanups + +- Add some debugging +- Make the loop dependent only on retries +- Make it explicit that connect(2) success exits the loop +- Invert the error checking logic + +(cherry picked from commit f102c7146ed7f6e04af0ad3bce302476239f2502) +--- + src/rpc/virnetsocket.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c +index 5e5f1ab..fc8ce6c 100644 +--- a/src/rpc/virnetsocket.c ++++ b/src/rpc/virnetsocket.c +@@ -620,6 +620,9 @@ int virNetSocketNewConnectUNIX(const char *path, + char *rundir = NULL; + int ret = -1; + ++ VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon, ++ NULLSTR(binary)); ++ + memset(&localAddr, 0, sizeof(localAddr)); + memset(&remoteAddr, 0, sizeof(remoteAddr)); + +@@ -680,10 +683,15 @@ int virNetSocketNewConnectUNIX(const char *path, + if (remoteAddr.data.un.sun_path[0] == '@') + remoteAddr.data.un.sun_path[0] = '\0'; + +- while (retries && +- connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) { +- if (!(spawnDaemon && (errno == ENOENT || +- errno == ECONNREFUSED))) { ++ while (retries) { ++ if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) == 0) { ++ VIR_DEBUG("connect() succeeded"); ++ break; ++ } ++ VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno); ++ ++ if (!spawnDaemon || ++ (errno != ENOENT && errno != ECONNREFUSED)) { + virReportSystemError(errno, _("Failed to connect socket to '%s'"), + path); + goto cleanup; diff --git a/0005-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch b/0005-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch new file mode 100644 index 0000000..2134425 --- /dev/null +++ b/0005-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch @@ -0,0 +1,40 @@ +From: Cole Robinson +Date: Mon, 11 Jan 2016 20:08:45 -0500 +Subject: [PATCH] rpc: socket: Explicitly error if we exceed retry count + +When we autolaunch libvirtd for session URIs, we spin in a retry +loop waiting for the daemon to start and the connect(2) to succeed. + +However if we exceed the retry count, we don't explicitly raise an +error, which can yield a slew of different error messages elsewhere +in the code. + +Explicitly raise the last connect(2) failure if we run out of retries. + +(cherry picked from commit 8da02d528068942303923fc4f935e77cccac9c7c) +--- + src/rpc/virnetsocket.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c +index fc8ce6c..6a51dc8 100644 +--- a/src/rpc/virnetsocket.c ++++ b/src/rpc/virnetsocket.c +@@ -690,7 +690,9 @@ int virNetSocketNewConnectUNIX(const char *path, + } + VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno); + ++ retries--; + if (!spawnDaemon || ++ retries == 0 || + (errno != ENOENT && errno != ECONNREFUSED)) { + virReportSystemError(errno, _("Failed to connect socket to '%s'"), + path); +@@ -700,7 +702,6 @@ int virNetSocketNewConnectUNIX(const char *path, + if (virNetSocketForkDaemon(binary) < 0) + goto cleanup; + +- retries--; + usleep(5000); + } + diff --git a/0006-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch b/0006-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch new file mode 100644 index 0000000..dc1900c --- /dev/null +++ b/0006-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch @@ -0,0 +1,43 @@ +From: Cole Robinson +Date: Mon, 11 Jan 2016 20:13:38 -0500 +Subject: [PATCH] rpc: socket: Don't repeatedly attempt to launch daemon + +On every socket connect(2) attempt we were re-launching session +libvirtd, up to 100 times in 5 seconds. + +This understandably caused some weird load races and intermittent +qemu:///session startup failures + +https://bugzilla.redhat.com/show_bug.cgi?id=1271183 +(cherry picked from commit 2eb7a975756d05a5b54ab4acf60083beb6161ac6) +--- + src/rpc/virnetsocket.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c +index 6a51dc8..b132532 100644 +--- a/src/rpc/virnetsocket.c ++++ b/src/rpc/virnetsocket.c +@@ -619,6 +619,7 @@ int virNetSocketNewConnectUNIX(const char *path, + virSocketAddr remoteAddr; + char *rundir = NULL; + int ret = -1; ++ bool daemonLaunched = false; + + VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon, + NULLSTR(binary)); +@@ -699,8 +700,12 @@ int virNetSocketNewConnectUNIX(const char *path, + goto cleanup; + } + +- if (virNetSocketForkDaemon(binary) < 0) +- goto cleanup; ++ if (!daemonLaunched) { ++ if (virNetSocketForkDaemon(binary) < 0) ++ goto cleanup; ++ ++ daemonLaunched = true; ++ } + + usleep(5000); + } diff --git a/0007-security-Do-not-restore-kernel-and-initrd-labels.patch b/0007-security-Do-not-restore-kernel-and-initrd-labels.patch new file mode 100644 index 0000000..559405c --- /dev/null +++ b/0007-security-Do-not-restore-kernel-and-initrd-labels.patch @@ -0,0 +1,57 @@ +From: Jiri Denemark +Date: Fri, 15 Jan 2016 10:55:58 +0100 +Subject: [PATCH] security: Do not restore kernel and initrd labels + +Kernel/initrd files are essentially read-only shareable images and thus +should be handled in the same way. We already use the appropriate label +for kernel/initrd files when starting a domain, but when a domain gets +destroyed we would remove the labels which would make other running +domains using the same files very unhappy. + +https://bugzilla.redhat.com/show_bug.cgi?id=921135 + +Signed-off-by: Jiri Denemark +(cherry picked from commit 68acc701bd449481e3206723c25b18fcd3d261b7) +--- + src/security/security_dac.c | 8 -------- + src/security/security_selinux.c | 8 -------- + 2 files changed, 16 deletions(-) + +diff --git a/src/security/security_dac.c b/src/security/security_dac.c +index deb6980..d01215f 100644 +--- a/src/security/security_dac.c ++++ b/src/security/security_dac.c +@@ -971,14 +971,6 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr, + virSecurityDACRestoreSecurityFileLabel(def->os.loader->nvram) < 0) + rc = -1; + +- if (def->os.kernel && +- virSecurityDACRestoreSecurityFileLabel(def->os.kernel) < 0) +- rc = -1; +- +- if (def->os.initrd && +- virSecurityDACRestoreSecurityFileLabel(def->os.initrd) < 0) +- rc = -1; +- + if (def->os.dtb && + virSecurityDACRestoreSecurityFileLabel(def->os.dtb) < 0) + rc = -1; +diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c +index c2464c2..38f2a29 100644 +--- a/src/security/security_selinux.c ++++ b/src/security/security_selinux.c +@@ -1978,14 +1978,6 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr, + virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.loader->nvram) < 0) + rc = -1; + +- if (def->os.kernel && +- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.kernel) < 0) +- rc = -1; +- +- if (def->os.initrd && +- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.initrd) < 0) +- rc = -1; +- + if (def->os.dtb && + virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.dtb) < 0) + rc = -1; diff --git a/libvirt.spec b/libvirt.spec index 4291294..78fed39 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -378,7 +378,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 1.2.18.2 -Release: 1%{?dist}%{?extra_release} +Release: 2%{?dist}%{?extra_release} License: LGPLv2+ Group: Development/Libraries BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root @@ -389,6 +389,21 @@ URL: http://libvirt.org/ %endif Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz +# Fix XML validation with qemu commandline passthrough (bz #1292131) +Patch0001: 0001-schema-interleave-domain-name-and-uuid-with-other-el.patch +# Fix crash in libvirt_leasehelper (bz #1202350) +Patch0002: 0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch +# Generate consistent systemtap tapsets regardless of host arch (bz +# #1173641) +Patch0003: 0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch +# Fix qemu:///session error 'Transport endpoint is not connected' (bz +# #1271183) +Patch0004: 0004-rpc-socket-Minor-cleanups.patch +Patch0005: 0005-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch +Patch0006: 0006-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch +# Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975) +Patch0007: 0007-security-Do-not-restore-kernel-and-initrd-labels.patch + %if %{with_libvirtd} Requires: libvirt-daemon = %{version}-%{release} %if %{with_network} @@ -2331,6 +2346,15 @@ exit 0 %doc examples/systemtap %changelog +* Wed Jan 20 2016 Cole Robinson - 1.2.18.2-2 +- Fix XML validation with qemu commandline passthrough (bz #1292131) +- Fix crash in libvirt_leasehelper (bz #1202350) +- Generate consistent systemtap tapsets regardless of host arch (bz + #1173641) +- Fix qemu:///session error 'Transport endpoint is not connected' (bz + #1271183) +- Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975) + * Wed Dec 23 2015 Cole Robinson - 1.2.18.2-1 - Rebased to version 1.2.18.2 - disk backend is not removed properly when disk frontent hotplug fails (bz