From 53f63aa62d025cb347af54411cdd2690723cad11 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: May 29 2009 16:57:14 +0000 Subject: Upstream release 0.6.4 --- diff --git a/.cvsignore b/.cvsignore index 2fdf983..63d6e7e 100644 --- a/.cvsignore +++ b/.cvsignore @@ -7,3 +7,4 @@ libvirt-0.6.0.tar.gz libvirt-0.6.1.tar.gz libvirt-0.6.2.tar.gz libvirt-0.6.3.tar.gz +libvirt-0.6.4.tar.gz diff --git a/libvirt-0.6.3-bring-up-ipless-bridge.patch b/libvirt-0.6.3-bring-up-ipless-bridge.patch deleted file mode 100644 index 3b8d3d2..0000000 --- a/libvirt-0.6.3-bring-up-ipless-bridge.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 4db7474b0c1907e877d7206edeb4d73962971096 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard -Date: Tue, 12 May 2009 15:31:22 +0000 -Subject: [PATCH 1/1] * src/network_driver.c: enable bridges which are not up - without an IP address, patch by Ludwig Nussel - Daniel - ---- - src/network_driver.c | 9 +++------ - 1 files changed, 3 insertions(+), 6 deletions(-) - -diff --git a/src/network_driver.c b/src/network_driver.c -index a17a769..a163b15 100644 ---- a/src/network_driver.c -+++ b/src/network_driver.c -@@ -836,8 +836,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn, - goto err_delbr; - } - -- if (network->def->ipAddress && -- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) { -+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) { - virReportSystemError(conn, err, - _("failed to bring the bridge '%s' up"), - network->def->bridge); -@@ -878,8 +877,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn, - networkRemoveIptablesRules(driver, network); - - err_delbr1: -- if (network->def->ipAddress && -- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) { -+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) { - char ebuf[1024]; - networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"), - network->def->bridge, virStrerror(err, ebuf, sizeof ebuf)); -@@ -920,8 +918,7 @@ static int networkShutdownNetworkDaemon(virConnectPtr conn, - networkRemoveIptablesRules(driver, network); - - char ebuf[1024]; -- if (network->def->ipAddress && -- (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) { -+ if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) { - networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"), - network->def->bridge, virStrerror(err, ebuf, sizeof ebuf)); - } --- -1.6.0.6 - diff --git a/libvirt-0.6.3-enable-qemu-0-10-migration.patch b/libvirt-0.6.3-enable-qemu-0-10-migration.patch deleted file mode 100644 index 98db412..0000000 --- a/libvirt-0.6.3-enable-qemu-0-10-migration.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: "Daniel P. Berrange" -To: libvir-list@redhat.com -Date: Thu, 30 Apr 2009 15:09:05 +0100 -Subject: [libvirt] PATCH: Enable migration with QEMU >= 0.10.0 - -The KVM migration code was added to QEMU for the 0.10.0 release, so we -should enable this in libvirt now. - -Daniel - -diff -r be7993675e07 src/qemu_conf.c ---- a/src/qemu_conf.c Thu Apr 30 14:49:27 2009 +0100 -+++ b/src/qemu_conf.c Thu Apr 30 15:08:45 2009 +0100 -@@ -473,16 +473,13 @@ int qemudExtractVersionInfo(const char * - - /* - * Handling of -incoming arg with varying features -- * -incoming tcp (kvm >= 79) -- * -incoming exec (kvm >= 80) -+ * -incoming tcp (kvm >= 79, qemu >= 0.10.0) -+ * -incoming exec (kvm >= 80, qemu >= 0.10.0) - * -incoming stdio (all earlier kvm) - * - * NB, there was a pre-kvm-79 'tcp' support, but it - * was broken, because it blocked the monitor console - * while waiting for data, so pretend it doesn't exist -- * -- * XXX when next QEMU release after 0.9.1 arrives, -- * we'll need to add MIGRATE_QEMU_TCP/EXEC here too - */ - if (kvm_version >= 79) { - flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP; -@@ -490,6 +487,9 @@ int qemudExtractVersionInfo(const char * - flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC; - } else if (kvm_version > 0) { - flags |= QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO; -+ } else if (version >= 10000) { -+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP; -+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC; - } - - if (retversion) - - --- diff --git a/libvirt-0.6.3-event-handling-1.patch b/libvirt-0.6.3-event-handling-1.patch deleted file mode 100644 index 4104a6b..0000000 --- a/libvirt-0.6.3-event-handling-1.patch +++ /dev/null @@ -1,144 +0,0 @@ -From e7be6cc841a5652b73ddd2ccd3769c7f8bbad13d Mon Sep 17 00:00:00 2001 -From: Daniel P. Berrange -Date: Tue, 12 May 2009 16:41:49 +0000 -Subject: [PATCH 1/2] Fix interrupting of main event thread & protect against accidental uniniitalized variables - ---- - qemud/event.c | 42 +++++++++++++++++++++++++++++++++++------- - 1 files changed, 35 insertions(+), 7 deletions(-) - -diff --git a/qemud/event.c b/qemud/event.c -index 65f548e..754f2b1 100644 ---- a/qemud/event.c -+++ b/qemud/event.c -@@ -84,10 +84,10 @@ struct virEventLoop { - static struct virEventLoop eventLoop; - - /* Unique ID for the next FD watch to be registered */ --static int nextWatch = 0; -+static int nextWatch = 1; - - /* Unique ID for the next timer to be registered */ --static int nextTimer = 0; -+static int nextTimer = 1; - - static void virEventLock(void) - { -@@ -143,15 +143,22 @@ int virEventAddHandleImpl(int fd, int events, - - void virEventUpdateHandleImpl(int watch, int events) { - int i; -+ EVENT_DEBUG("Update handle w=%d e=%d", watch, events); -+ -+ if (watch <= 0) { -+ VIR_WARN("Ignoring invalid update watch %d", watch); -+ return; -+ } -+ - virEventLock(); - for (i = 0 ; i < eventLoop.handlesCount ; i++) { - if (eventLoop.handles[i].watch == watch) { - eventLoop.handles[i].events = - virEventHandleTypeToPollEvent(events); -+ virEventInterruptLocked(); - break; - } - } -- virEventInterruptLocked(); - virEventUnlock(); - } - -@@ -164,6 +171,12 @@ void virEventUpdateHandleImpl(int watch, int events) { - int virEventRemoveHandleImpl(int watch) { - int i; - EVENT_DEBUG("Remove handle %d", watch); -+ -+ if (watch <= 0) { -+ VIR_WARN("Ignoring invalid remove watch %d", watch); -+ return -1; -+ } -+ - virEventLock(); - for (i = 0 ; i < eventLoop.handlesCount ; i++) { - if (eventLoop.handles[i].deleted) -@@ -172,11 +185,11 @@ int virEventRemoveHandleImpl(int watch) { - if (eventLoop.handles[i].watch == watch) { - EVENT_DEBUG("mark delete %d %d", i, eventLoop.handles[i].fd); - eventLoop.handles[i].deleted = 1; -+ virEventInterruptLocked(); - virEventUnlock(); - return 0; - } - } -- virEventInterruptLocked(); - virEventUnlock(); - return -1; - } -@@ -232,6 +245,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) { - struct timeval tv; - int i; - EVENT_DEBUG("Updating timer %d timeout with %d ms freq", timer, frequency); -+ -+ if (timer <= 0) { -+ VIR_WARN("Ignoring invalid update timer %d", timer); -+ return; -+ } -+ - if (gettimeofday(&tv, NULL) < 0) { - return; - } -@@ -244,10 +263,10 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) { - frequency >= 0 ? frequency + - (((unsigned long long)tv.tv_sec)*1000) + - (((unsigned long long)tv.tv_usec)/1000) : 0; -+ virEventInterruptLocked(); - break; - } - } -- virEventInterruptLocked(); - virEventUnlock(); - } - -@@ -260,6 +279,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) { - int virEventRemoveTimeoutImpl(int timer) { - int i; - EVENT_DEBUG("Remove timer %d", timer); -+ -+ if (timer <= 0) { -+ VIR_WARN("Ignoring invalid remove timer %d", timer); -+ return -1; -+ } -+ - virEventLock(); - for (i = 0 ; i < eventLoop.timeoutsCount ; i++) { - if (eventLoop.timeouts[i].deleted) -@@ -267,11 +292,11 @@ int virEventRemoveTimeoutImpl(int timer) { - - if (eventLoop.timeouts[i].timer == timer) { - eventLoop.timeouts[i].deleted = 1; -+ virEventInterruptLocked(); - virEventUnlock(); - return 0; - } - } -- virEventInterruptLocked(); - virEventUnlock(); - return -1; - } -@@ -617,9 +642,12 @@ static int virEventInterruptLocked(void) - char c = '\0'; - - if (!eventLoop.running || -- pthread_self() == eventLoop.leader) -+ pthread_self() == eventLoop.leader) { -+ VIR_DEBUG("Skip interrupt, %d %d", eventLoop.running, (int)eventLoop.leader); - return 0; -+ } - -+ VIR_DEBUG0("Interrupting"); - if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c)) - return -1; - return 0; --- -1.6.0.6 - diff --git a/libvirt-0.6.3-event-handling-2.patch b/libvirt-0.6.3-event-handling-2.patch deleted file mode 100644 index ddcede6..0000000 --- a/libvirt-0.6.3-event-handling-2.patch +++ /dev/null @@ -1,197 +0,0 @@ -From 6483ee77ed12f037d68a6adc690624fa1b508dc0 Mon Sep 17 00:00:00 2001 -From: Daniel P. Berrange -Date: Tue, 12 May 2009 16:43:04 +0000 -Subject: [PATCH 2/2] Fix watch/timer event deletion - ---- - qemud/event.c | 112 ++++++++++++++++++++++++++------------------------------- - 1 files changed, 51 insertions(+), 61 deletions(-) - -diff --git a/qemud/event.c b/qemud/event.c -index 754f2b1..a57d967 100644 ---- a/qemud/event.c -+++ b/qemud/event.c -@@ -313,7 +313,7 @@ static int virEventCalculateTimeout(int *timeout) { - EVENT_DEBUG("Calculate expiry of %d timers", eventLoop.timeoutsCount); - /* Figure out if we need a timeout */ - for (i = 0 ; i < eventLoop.timeoutsCount ; i++) { -- if (eventLoop.timeouts[i].deleted || eventLoop.timeouts[i].frequency < 0) -+ if (eventLoop.timeouts[i].frequency < 0) - continue; - - EVENT_DEBUG("Got a timeout scheduled for %llu", eventLoop.timeouts[i].expiresAt); -@@ -350,32 +350,26 @@ static int virEventCalculateTimeout(int *timeout) { - * file handles. The caller must free the returned data struct - * returns: the pollfd array, or NULL on error - */ --static int virEventMakePollFDs(struct pollfd **retfds) { -+static struct pollfd *virEventMakePollFDs(void) { - struct pollfd *fds; -- int i, nfds = 0; -+ int i; - -- for (i = 0 ; i < eventLoop.handlesCount ; i++) { -- if (eventLoop.handles[i].deleted) -- continue; -- nfds++; -- } -- *retfds = NULL; - /* Setup the poll file handle data structs */ -- if (VIR_ALLOC_N(fds, nfds) < 0) -- return -1; -+ if (VIR_ALLOC_N(fds, eventLoop.handlesCount) < 0) -+ return NULL; - -- for (i = 0, nfds = 0 ; i < eventLoop.handlesCount ; i++) { -- if (eventLoop.handles[i].deleted) -- continue; -- fds[nfds].fd = eventLoop.handles[i].fd; -- fds[nfds].events = eventLoop.handles[i].events; -- fds[nfds].revents = 0; -+ for (i = 0 ; i < eventLoop.handlesCount ; i++) { -+ EVENT_DEBUG("Prepare n=%d w=%d, f=%d e=%d", i, -+ eventLoop.handles[i].watch, -+ eventLoop.handles[i].fd, -+ eventLoop.handles[i].events); -+ fds[i].fd = eventLoop.handles[i].fd; -+ fds[i].events = eventLoop.handles[i].events; -+ fds[i].revents = 0; - //EVENT_DEBUG("Wait for %d %d", eventLoop.handles[i].fd, eventLoop.handles[i].events); -- nfds++; - } - -- *retfds = fds; -- return nfds; -+ return fds; - } - - -@@ -435,26 +429,30 @@ static int virEventDispatchTimeouts(void) { - * Returns 0 upon success, -1 if an error occurred - */ - static int virEventDispatchHandles(int nfds, struct pollfd *fds) { -- int i, n; -+ int i; - -- for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) { -+ /* NB, use nfds not eventLoop.handlesCount, because new -+ * fds might be added on end of list, and they're not -+ * in the fds array we've got */ -+ for (i = 0 ; i < nfds ; i++) { - if (eventLoop.handles[i].deleted) { -- EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd); -+ EVENT_DEBUG("Skip deleted n=%d w=%d f=%d", i, -+ eventLoop.handles[i].watch, eventLoop.handles[i].fd); - continue; - } - -- if (fds[n].revents) { -+ if (fds[i].revents) { - virEventHandleCallback cb = eventLoop.handles[i].cb; - void *opaque = eventLoop.handles[i].opaque; -- int hEvents = virPollEventToEventHandleType(fds[n].revents); -- EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd, -- fds[n].revents, eventLoop.handles[i].opaque); -+ int hEvents = virPollEventToEventHandleType(fds[i].revents); -+ EVENT_DEBUG("Dispatch n=%d f=%d w=%d e=%d %p", i, -+ fds[i].fd, eventLoop.handles[i].watch, -+ fds[i].revents, eventLoop.handles[i].opaque); - virEventUnlock(); - (cb)(eventLoop.handles[i].watch, -- fds[n].fd, hEvents, opaque); -+ fds[i].fd, hEvents, opaque); - virEventLock(); - } -- n++; - } - - return 0; -@@ -545,22 +543,21 @@ static int virEventCleanupHandles(void) { - * at least one file handle has an event, or a timer expires - */ - int virEventRunOnce(void) { -- struct pollfd *fds; -+ struct pollfd *fds = NULL; - int ret, timeout, nfds; - - virEventLock(); - eventLoop.running = 1; - eventLoop.leader = pthread_self(); -- if ((nfds = virEventMakePollFDs(&fds)) < 0) { -- virEventUnlock(); -- return -1; -- } - -- if (virEventCalculateTimeout(&timeout) < 0) { -- VIR_FREE(fds); -- virEventUnlock(); -- return -1; -- } -+ if (virEventCleanupTimeouts() < 0 || -+ virEventCleanupHandles() < 0) -+ goto error; -+ -+ if (!(fds = virEventMakePollFDs()) || -+ virEventCalculateTimeout(&timeout) < 0) -+ goto error; -+ nfds = eventLoop.handlesCount; - - virEventUnlock(); - -@@ -572,38 +569,31 @@ int virEventRunOnce(void) { - if (errno == EINTR) { - goto retry; - } -- VIR_FREE(fds); -- return -1; -+ goto error_unlocked; - } - - virEventLock(); -- if (virEventDispatchTimeouts() < 0) { -- VIR_FREE(fds); -- virEventUnlock(); -- return -1; -- } -+ if (virEventDispatchTimeouts() < 0) -+ goto error; - - if (ret > 0 && -- virEventDispatchHandles(nfds, fds) < 0) { -- VIR_FREE(fds); -- virEventUnlock(); -- return -1; -- } -- VIR_FREE(fds); -- -- if (virEventCleanupTimeouts() < 0) { -- virEventUnlock(); -- return -1; -- } -+ virEventDispatchHandles(nfds, fds) < 0) -+ goto error; - -- if (virEventCleanupHandles() < 0) { -- virEventUnlock(); -- return -1; -- } -+ if (virEventCleanupTimeouts() < 0 || -+ virEventCleanupHandles() < 0) -+ goto error; - - eventLoop.running = 0; - virEventUnlock(); -+ VIR_FREE(fds); - return 0; -+ -+error: -+ virEventUnlock(); -+error_unlocked: -+ VIR_FREE(fds); -+ return -1; - } - - static void virEventHandleWakeup(int watch ATTRIBUTE_UNUSED, --- -1.6.0.6 - diff --git a/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch b/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch deleted file mode 100644 index 5c532a5..0000000 --- a/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 2b3fcdc378e7bec5c1a78b81632756e92930fd24 Mon Sep 17 00:00:00 2001 -From: Daniel P. Berrange -Date: Mon, 11 May 2009 15:14:24 +0000 -Subject: [PATCH 1/1] Fix QEMU ARGV detection with kvm >= 85 - ---- - src/qemu_conf.c | 18 ++++++++++++++---- - src/qemu_driver.c | 12 ++---------- - 2 files changed, 16 insertions(+), 14 deletions(-) - -diff --git a/src/qemu_conf.c b/src/qemu_conf.c -index 9cb71eb..a57d3ab 100644 ---- a/src/qemu_conf.c -+++ b/src/qemu_conf.c -@@ -431,18 +431,28 @@ int qemudExtractVersionInfo(const char *qemu, - return -1; - - char *help = NULL; -- enum { MAX_HELP_OUTPUT_SIZE = 8192 }; -+ enum { MAX_HELP_OUTPUT_SIZE = 1024*64 }; - int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help); -- if (len < 0) -+ if (len < 0) { -+ virReportSystemError(NULL, errno, "%s", -+ _("Unable to read QEMU help output")); - goto cleanup2; -+ } - - if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)", - &major, &minor, µ, &kvm_version) != 4) - kvm_version = 0; - -- if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u", -- &major, &minor, µ) != 3) -+ if (!kvm_version && -+ sscanf(help, "QEMU PC emulator version %u.%u.%u", -+ &major, &minor, µ) != 3) { -+ char *eol = strchr(help, '\n'); -+ if (eol) *eol = '\0'; -+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, -+ _("cannot parse QEMU version number in '%s'"), -+ help); - goto cleanup2; -+ } - - version = (major * 1000 * 1000) + (minor * 1000) + micro; - -diff --git a/src/qemu_driver.c b/src/qemu_driver.c -index 30642d5..bd60b29 100644 ---- a/src/qemu_driver.c -+++ b/src/qemu_driver.c -@@ -1391,12 +1391,8 @@ static int qemudStartVMDaemon(virConnectPtr conn, - - if (qemudExtractVersionInfo(emulator, - NULL, -- &qemuCmdFlags) < 0) { -- qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, -- _("Cannot determine QEMU argv syntax %s"), -- emulator); -+ &qemuCmdFlags) < 0) - goto cleanup; -- } - - if (qemuPrepareHostDevices(conn, vm->def) < 0) - goto cleanup; -@@ -3715,12 +3711,8 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn, - - if (qemudExtractVersionInfo(vm->def->emulator, - NULL, -- &qemuCmdFlags) < 0) { -- qemudReportError(conn, dom, NULL, VIR_ERR_INTERNAL_ERROR, -- _("Cannot determine QEMU argv syntax %s"), -- vm->def->emulator); -+ &qemuCmdFlags) < 0) - return -1; -- } - - if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) { - if (!(devname = qemudDiskDeviceName(conn, newdisk))) --- -1.6.0.6 - diff --git a/libvirt-0.6.3-hostdev-managed.patch b/libvirt-0.6.3-hostdev-managed.patch deleted file mode 100644 index 4d62aaa..0000000 --- a/libvirt-0.6.3-hostdev-managed.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 3d7771e0570e09096ad9391a857dad48b150bc0c Mon Sep 17 00:00:00 2001 -From: Mark McLoughlin -Date: Wed, 6 May 2009 16:33:28 +0100 -Subject: [PATCH] Fix qemu driver's interpretation of - -This change: - - Tue Mar 3 08:55:13 GMT 2009 Daniel P. Berrange - - Don't try to detach & reset PCI devices while running test - suite for XML-> ARGV conversion. - * src/qemu_driver.c: Add qemuPrepareHostDevices() helper to - detach and reset PCI devices. - * src/qemu_conf.c: Don't detach & reset PCI devices while - building the command line argv - -accidentally did this: - -- if (hostdev->managed) { -+ if (!hostdev->managed) { - -Which results in managed='yes' not causing the device to be -detached when the guest is starting. - -Signed-off-by: Mark McLoughlin ---- - src/qemu_driver.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/src/qemu_driver.c b/src/qemu_driver.c -index 5898026..59312c0 100644 ---- a/src/qemu_driver.c -+++ b/src/qemu_driver.c -@@ -1215,7 +1215,7 @@ static int qemuPrepareHostDevices(virConnectPtr conn, - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) - continue; - -- if (!hostdev->managed) { -+ if (hostdev->managed) { - pciDevice *dev = pciGetDevice(conn, - hostdev->source.subsys.u.pci.domain, - hostdev->source.subsys.u.pci.bus, --- -1.6.0.6 - diff --git a/libvirt-0.6.3-refresh-qemu-caps.patch b/libvirt-0.6.3-refresh-qemu-caps.patch deleted file mode 100644 index 804d54e..0000000 --- a/libvirt-0.6.3-refresh-qemu-caps.patch +++ /dev/null @@ -1,76 +0,0 @@ -commit 0e51348cb9aeafe5e2fd6469a4bde0baa1eb8720 -Author: Cole Robinson -Date: Mon May 4 15:06:03 2009 -0400 - - Refresh QEMU driver capabilities for each getCapabilities call. - - Also fix up a couple issues where caps are accessed without locking - the driver structure. - -diff --git a/src/qemu_driver.c b/src/qemu_driver.c -index 23ea961..790dac6 100644 ---- a/src/qemu_driver.c -+++ b/src/qemu_driver.c -@@ -1885,10 +1885,12 @@ static int qemudGetNodeInfo(virConnectPtr conn, - - static char *qemudGetCapabilities(virConnectPtr conn) { - struct qemud_driver *driver = conn->privateData; -- char *xml; -+ char *xml = NULL; - - qemuDriverLock(driver); -- if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL) -+ virCapabilitiesFree(qemu_driver->caps); -+ if ((qemu_driver->caps = qemudCapsInit()) == NULL || -+ (xml = virCapabilitiesFormatXML(driver->caps)) == NULL) - virReportOOMError(conn); - qemuDriverUnlock(driver); - -@@ -3169,20 +3171,26 @@ cleanup: - return ret; - } - --static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel) -+static int qemudNodeGetSecurityModel(virConnectPtr conn, -+ virSecurityModelPtr secmodel) - { - struct qemud_driver *driver = (struct qemud_driver *)conn->privateData; - char *p; -+ int ret = 0; - -- if (!driver->securityDriver) -- return -2; -+ qemuDriverLock(driver); -+ if (!driver->securityDriver) { -+ ret = -2; -+ goto cleanup; -+ } - - p = driver->caps->host.secModel.model; - if (strlen(p) >= VIR_SECURITY_MODEL_BUFLEN-1) { - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, - _("security model string exceeds max %d bytes"), - VIR_SECURITY_MODEL_BUFLEN-1); -- return -1; -+ ret = -1; -+ goto cleanup; - } - strcpy(secmodel->model, p); - -@@ -3191,10 +3199,14 @@ static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr sec - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, - _("security DOI string exceeds max %d bytes"), - VIR_SECURITY_DOI_BUFLEN-1); -- return -1; -+ ret = -1; -+ goto cleanup; - } - strcpy(secmodel->doi, p); -- return 0; -+ -+cleanup: -+ qemuDriverUnlock(driver); -+ return ret; - } - - /* TODO: check seclabel restore */ diff --git a/libvirt-0.6.3-shared-readonly-label.patch b/libvirt-0.6.3-shared-readonly-label.patch deleted file mode 100644 index e962d18..0000000 --- a/libvirt-0.6.3-shared-readonly-label.patch +++ /dev/null @@ -1,76 +0,0 @@ -diff -rup libvirt-0.6.2/src/security_selinux.c libvirt-0.6.2.new/src/security_selinux.c ---- libvirt-0.6.2/src/security_selinux.c 2009-04-03 15:36:56.000000000 +0100 -+++ libvirt-0.6.2.new/src/security_selinux.c 2009-05-05 13:39:42.000000000 +0100 -@@ -24,11 +24,12 @@ - #include "virterror_internal.h" - #include "util.h" - #include "memory.h" -- -+#include "logging.h" - - #define VIR_FROM_THIS VIR_FROM_SECURITY - - static char default_domain_context[1024]; -+static char default_content_context[1024]; - static char default_image_context[1024]; - #define SECURITY_SELINUX_VOID_DOI "0" - #define SECURITY_SELINUX_NAME "selinux" -@@ -148,8 +149,13 @@ SELinuxInitialize(virConnectPtr conn) - close(fd); - - ptr = strchrnul(default_image_context, '\n'); -- *ptr = '\0'; -- -+ if (*ptr == '\n') { -+ *ptr = '\0'; -+ strcpy(default_content_context, ptr+1); -+ ptr = strchrnul(default_content_context, '\n'); -+ if (*ptr == '\n') -+ *ptr = '\0'; -+ } - return 0; - } - -@@ -275,6 +281,8 @@ SELinuxSetFilecon(virConnectPtr conn, co - { - char ebuf[1024]; - -+ VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon); -+ - if(setfilecon(path, tcon) < 0) { - virSecurityReportError(conn, VIR_ERR_ERROR, - _("%s: unable to set security context " -@@ -299,6 +307,8 @@ SELinuxRestoreSecurityImageLabel(virConn - char *newpath = NULL; - const char *path = disk->src; - -+ /* Don't restore labels on readoly/shared disks, because -+ * other VMs may still be accessing these */ - if (disk->readonly || disk->shared) - return 0; - -@@ -328,8 +338,13 @@ SELinuxSetSecurityImageLabel(virConnectP - { - const virSecurityLabelDefPtr secdef = &vm->def->seclabel; - -- if (secdef->imagelabel) -+ if (disk->shared) { -+ return SELinuxSetFilecon(conn, disk->src, default_image_context); -+ } else if (disk->readonly) { -+ return SELinuxSetFilecon(conn, disk->src, default_content_context); -+ } else if (secdef->imagelabel) { - return SELinuxSetFilecon(conn, disk->src, secdef->imagelabel); -+ } - - return 0; - } -@@ -403,9 +418,6 @@ SELinuxSetSecurityLabel(virConnectPtr co - - if (secdef->imagelabel) { - for (i = 0 ; i < vm->def->ndisks ; i++) { -- if (vm->def->disks[i]->readonly || -- vm->def->disks[i]->shared) continue; -- - if (SELinuxSetSecurityImageLabel(conn, vm, vm->def->disks[i]) < 0) - return -1; - } diff --git a/libvirt-0.6.3-svirt-sound.patch b/libvirt-0.6.3-svirt-sound.patch deleted file mode 100644 index 3668c7b..0000000 --- a/libvirt-0.6.3-svirt-sound.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- src/qemu_conf.c.orig 2009-04-02 11:50:10.000000000 +0200 -+++ src/qemu_conf.c 2009-04-03 17:46:59.000000000 +0200 -@@ -779,6 +779,20 @@ int qemudBuildCommandLine(virConnectPtr - char domid[50]; - char *pidfile; - const char *cpu = NULL; -+ int skipSound = 0; -+ -+ if (driver->securityDriver && -+ driver->securityDriver->name && -+ STREQ(driver->securityDriver->name, "selinux") && -+ getuid() == 0) { -+ static int soundWarned = 0; -+ skipSound = 1; -+ if (def->nsounds && -+ !soundWarned) { -+ soundWarned = 1; -+ VIR_WARN0("Sound cards for VMs are disabled while SELinux security model is active"); -+ } -+ } - - uname_normalize(&ut); - -@@ -1425,7 +1439,8 @@ int qemudBuildCommandLine(virConnectPtr - } - - /* Add sound hardware */ -- if (def->nsounds) { -+ if (def->nsounds && -+ !skipSound) { - int size = 100; - char *modstr; - if (VIR_ALLOC_N(modstr, size+1) < 0) diff --git a/libvirt-0.6.3-xml-attribute-escaping.patch b/libvirt-0.6.3-xml-attribute-escaping.patch deleted file mode 100644 index 5c9ecf5..0000000 --- a/libvirt-0.6.3-xml-attribute-escaping.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 7f7a4403860f56d5a1ad65bfd16f5bf97a971d45 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard -Date: Wed, 13 May 2009 16:19:59 +0000 -Subject: [PATCH 1/1] * src/buf.c: avoid an XML attribute escaping bug #499791 - daniel - ---- - src/buf.c | 16 +++++++++++++++- - 1 files changed, 15 insertions(+), 1 deletions(-) - -diff --git a/src/buf.c b/src/buf.c -index cdcdac9..259175d 100644 ---- a/src/buf.c -+++ b/src/buf.c -@@ -266,7 +266,7 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st - return; - - len = strlen(str); -- if (VIR_ALLOC_N(escaped, 5 * len + 1) < 0) { -+ if (VIR_ALLOC_N(escaped, 6 * len + 1) < 0) { - virBufferNoMemory(buf); - return; - } -@@ -290,6 +290,20 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; -+ } else if (*cur == '"') { -+ *out++ = '&'; -+ *out++ = 'q'; -+ *out++ = 'u'; -+ *out++ = 'o'; -+ *out++ = 't'; -+ *out++ = ';'; -+ } else if (*cur == '\'') { -+ *out++ = '&'; -+ *out++ = 'a'; -+ *out++ = 'p'; -+ *out++ = 'o'; -+ *out++ = 's'; -+ *out++ = ';'; - } else if ((*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') || - (*cur == '\r')) { - /* --- -1.6.0.6 - diff --git a/libvirt.spec b/libvirt.spec index 9215ca4..6c12377 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -54,34 +54,14 @@ Summary: Library providing a simple API virtualization Name: libvirt -Version: 0.6.3 -Release: 11%{?dist}%{?extra_release} +Version: 0.6.4 +Release: 1%{?dist}%{?extra_release} License: LGPLv2+ Group: Development/Libraries Source: libvirt-%{version}.tar.gz # Patches cherry-picked from upstream -# Handle shared/readonly image labelling (bz 493692) -Patch1: libvirt-0.6.3-shared-readonly-label.patch -# Handle correctly (bz 499386) -Patch2: libvirt-0.6.3-hostdev-managed.patch -# Refresh qemu caps when getCapabilities is called (bz 460649) -Patch3: libvirt-0.6.3-refresh-qemu-caps.patch -# Enable migration with qemu 0.10 Enable (bz 499704) -Patch4: libvirt-0.6.3-enable-qemu-0-10-migration.patch -# Don't try to label a disk with no path (e.g. empty cdrom) (bz 499569) -Patch5: libvirt-0.6.2-fix-nosource-label.patch -# Fix qemu argv detection with latest qemu (bz 501923) -Patch6: libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch -# Fix XML attribute escaping (bz 499791) -Patch7: libvirt-0.6.3-xml-attribute-escaping.patch -# Fix serious event handling issues causing guests to be destroyed (bz 499698) -Patch8: libvirt-0.6.3-event-handling-1.patch -Patch9: libvirt-0.6.3-event-handling-2.patch -# Bring up the bridge, even if it doesn't have an IP address (bz 501912) -Patch10: libvirt-0.6.3-bring-up-ipless-bridge.patch - # Patches not for upstream. # Temporary hack till PulseAudio autostart problems are sorted @@ -236,16 +216,6 @@ of recent versions of Linux (and other OSes). %prep %setup -q -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 %patch200 -p0 @@ -576,6 +546,12 @@ fi %endif %changelog +* Fri May 29 2009 Daniel Veillard - 0.6.4-1.fc12 +- Upstream release of 0.6.4 +- new APIs +- fixes for latests QEmu/KVM versions +- various assorted fixes + * Mon May 25 2009 Mark McLoughlin - 0.6.3-11.fc12 - Bring up the bridge, even if it doesn't have an IP address (bug #501912) diff --git a/sources b/sources index b97a784..4bf0ae1 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -dd618bf0943a0be853ccc08308c7f427 libvirt-0.6.3.tar.gz +344a6913a94582ea3ab0ad75a9bfef22 libvirt-0.6.4.tar.gz