Compare commits
3 Commits
libvirt-0_
...
libvirt-0_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8841355697 | ||
|
|
40a867daeb | ||
|
|
60e1b2cda5 |
24
libvirt-0.6.2-buf-locale-escape.patch
Normal file
24
libvirt-0.6.2-buf-locale-escape.patch
Normal file
@@ -0,0 +1,24 @@
|
||||
commit 8feb499ba2c3625632210c997b49f5df515c05d4
|
||||
Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Tue Aug 4 18:13:09 2009 +0100
|
||||
|
||||
Fix escaping of 8-bit high characters
|
||||
|
||||
Fix https://bugzilla.redhat.com/show_bug.cgi?id=479517
|
||||
|
||||
* src/buf.c: Cast to 'unsigned char' before doing compare to
|
||||
avoid rejecting 8-bit high characters
|
||||
|
||||
diff --git a/src/buf.c b/src/buf.c
|
||||
index 259175d..c802aa2 100644
|
||||
--- a/src/buf.c
|
||||
+++ b/src/buf.c
|
||||
@@ -304,7 +304,7 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st
|
||||
*out++ = 'o';
|
||||
*out++ = 's';
|
||||
*out++ = ';';
|
||||
- } else if ((*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') ||
|
||||
+ } else if (((unsigned char)*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') ||
|
||||
(*cur == '\r')) {
|
||||
/*
|
||||
* default case, just copy !
|
||||
@@ -0,0 +1,47 @@
|
||||
From ae4523336ac06e3ff7cc7b416fad9e57998c6b54 Mon Sep 17 00:00:00 2001
|
||||
From: Tim Waugh <twaugh@redhat.com>
|
||||
Date: Fri, 3 Jul 2009 10:29:01 +0100
|
||||
Subject: [PATCH 2/3] Don't unnecessarily try to change a file context
|
||||
|
||||
As pointed out by Tim Waugh here:
|
||||
|
||||
https://bugzilla.redhat.com/507555
|
||||
|
||||
We shouldn't bother trying to set the context of a file if it already
|
||||
matches what we want.
|
||||
|
||||
(Fixed to use STREQ() and not use tabs, as pointed out by danpb)
|
||||
|
||||
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
||||
---
|
||||
src/security_selinux.c | 11 ++++++++++-
|
||||
1 files changed, 10 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/security_selinux.c b/src/security_selinux.c
|
||||
index db1c27d..c2015a1 100644
|
||||
--- a/src/security_selinux.c
|
||||
+++ b/src/security_selinux.c
|
||||
@@ -280,10 +280,19 @@ static int
|
||||
SELinuxSetFilecon(virConnectPtr conn, const char *path, char *tcon)
|
||||
{
|
||||
char ebuf[1024];
|
||||
+ security_context_t econ;
|
||||
|
||||
VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon);
|
||||
|
||||
- if(setfilecon(path, tcon) < 0) {
|
||||
+ if (setfilecon(path, tcon) < 0) {
|
||||
+ if (getfilecon(path, &econ) >= 0) {
|
||||
+ if (STREQ(tcon, econ)) {
|
||||
+ freecon(econ);
|
||||
+ /* It's alright, there's nothing to change anyway. */
|
||||
+ return 0;
|
||||
+ }
|
||||
+ freecon(econ);
|
||||
+ }
|
||||
virSecurityReportError(conn, VIR_ERR_ERROR,
|
||||
_("%s: unable to set security context "
|
||||
"'\%s\' on %s: %s."), __func__,
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
From 80965bff6d46dea1808c8bbf02f50f0e289a0e65 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon, 29 Jun 2009 10:41:56 +0000
|
||||
Subject: [PATCH] Fix crash in QEMU driver with bad capabilities data
|
||||
|
||||
---
|
||||
src/qemu_driver.c | 80 +++++++++++++++++++++++++++++++++++-----------------
|
||||
1 files changed, 54 insertions(+), 26 deletions(-)
|
||||
|
||||
diff -up libvirt-0.6.2/src/qemu_driver.c.bad-caps libvirt-0.6.2/src/qemu_driver.c
|
||||
--- libvirt-0.6.2/src/qemu_driver.c.bad-caps 2009-07-03 10:07:03.275252815 +0100
|
||||
+++ libvirt-0.6.2/src/qemu_driver.c 2009-07-03 10:08:52.143502961 +0100
|
||||
@@ -360,12 +360,43 @@ next:
|
||||
return 0;
|
||||
}
|
||||
|
||||
+
|
||||
+static int
|
||||
+qemudSecurityCapsInit(virSecurityDriverPtr secdrv,
|
||||
+ virCapsPtr caps)
|
||||
+{
|
||||
+ const char *doi, *model;
|
||||
+
|
||||
+ doi = virSecurityDriverGetDOI(secdrv);
|
||||
+ model = virSecurityDriverGetModel(secdrv);
|
||||
+
|
||||
+ caps->host.secModel.model = strdup(model);
|
||||
+ if (!caps->host.secModel.model) {
|
||||
+ char ebuf[1024];
|
||||
+ VIR_ERROR(_("Failed to copy secModel model: %s"),
|
||||
+ virStrerror(errno, ebuf, sizeof ebuf));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ caps->host.secModel.doi = strdup(doi);
|
||||
+ if (!caps->host.secModel.doi) {
|
||||
+ char ebuf[1024];
|
||||
+ VIR_ERROR(_("Failed to copy secModel DOI: %s"),
|
||||
+ virStrerror(errno, ebuf, sizeof ebuf));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ VIR_DEBUG("Initialized caps for security driver \"%s\" with "
|
||||
+ "DOI \"%s\"", model, doi);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
qemudSecurityInit(struct qemud_driver *qemud_drv)
|
||||
{
|
||||
int ret;
|
||||
- const char *doi, *model;
|
||||
- virCapsPtr caps;
|
||||
virSecurityDriverPtr security_drv;
|
||||
|
||||
ret = virSecurityDriverStartup(&security_drv,
|
||||
@@ -381,36 +412,17 @@ qemudSecurityInit(struct qemud_driver *q
|
||||
}
|
||||
|
||||
qemud_drv->securityDriver = security_drv;
|
||||
- doi = virSecurityDriverGetDOI(security_drv);
|
||||
- model = virSecurityDriverGetModel(security_drv);
|
||||
|
||||
- VIR_DEBUG("Initialized security driver \"%s\" with "
|
||||
- "DOI \"%s\"", model, doi);
|
||||
+ VIR_INFO("Initialized security driver %s", security_drv->name);
|
||||
|
||||
/*
|
||||
* Add security policy host caps now that the security driver is
|
||||
* initialized.
|
||||
*/
|
||||
- caps = qemud_drv->caps;
|
||||
-
|
||||
- caps->host.secModel.model = strdup(model);
|
||||
- if (!caps->host.secModel.model) {
|
||||
- char ebuf[1024];
|
||||
- VIR_ERROR(_("Failed to copy secModel model: %s"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- return -1;
|
||||
- }
|
||||
+ return qemudSecurityCapsInit(security_drv, qemud_drv->caps);
|
||||
+}
|
||||
|
||||
- caps->host.secModel.doi = strdup(doi);
|
||||
- if (!caps->host.secModel.doi) {
|
||||
- char ebuf[1024];
|
||||
- VIR_ERROR(_("Failed to copy secModel DOI: %s"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- return -1;
|
||||
- }
|
||||
|
||||
- return 0;
|
||||
-}
|
||||
|
||||
/**
|
||||
* qemudStartup:
|
||||
@@ -1852,13 +1864,29 @@ static int qemudGetNodeInfo(virConnectPt
|
||||
|
||||
static char *qemudGetCapabilities(virConnectPtr conn) {
|
||||
struct qemud_driver *driver = conn->privateData;
|
||||
+ virCapsPtr caps;
|
||||
char *xml = NULL;
|
||||
|
||||
qemuDriverLock(driver);
|
||||
+ if ((caps = qemudCapsInit()) == NULL) {
|
||||
+ virReportOOMError(conn);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
+ if (qemu_driver->securityDriver &&
|
||||
+ qemudSecurityCapsInit(qemu_driver->securityDriver, caps) < 0) {
|
||||
+ virCapabilitiesFree(caps);
|
||||
+ virReportOOMError(conn);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
virCapabilitiesFree(qemu_driver->caps);
|
||||
- if ((qemu_driver->caps = qemudCapsInit()) == NULL ||
|
||||
- (xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
|
||||
+ qemu_driver->caps = caps;
|
||||
+
|
||||
+ if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
|
||||
virReportOOMError(conn);
|
||||
+
|
||||
+cleanup:
|
||||
qemuDriverUnlock(driver);
|
||||
|
||||
return xml;
|
||||
37
libvirt-0.6.2-hotplug-labelling.patch
Normal file
37
libvirt-0.6.2-hotplug-labelling.patch
Normal file
@@ -0,0 +1,37 @@
|
||||
commit 1795bfe4a177a5eff1b3b0a16d56df6f371c0f8e
|
||||
Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon Jul 6 16:01:55 2009 +0100
|
||||
|
||||
Fix SELinux denial during hotplug
|
||||
|
||||
* src/qemu_driver.c: Relabel disk images *before* running QEMU
|
||||
hotplug monitor commands
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 5a0ab12..342ba01 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -4225,10 +4225,14 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
|
||||
switch (dev->data.disk->device) {
|
||||
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
||||
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
||||
+ if (driver->securityDriver)
|
||||
+ driver->securityDriver->domainSetSecurityImageLabel(dom->conn, vm, dev->data.disk);
|
||||
ret = qemudDomainChangeEjectableMedia(dom->conn, vm, dev);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
||||
+ if (driver->securityDriver)
|
||||
+ driver->securityDriver->domainSetSecurityImageLabel(dom->conn, vm, dev->data.disk);
|
||||
if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
|
||||
ret = qemudDomainAttachUsbMassstorageDevice(dom->conn, vm, dev);
|
||||
} else if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_SCSI ||
|
||||
@@ -4240,8 +4244,6 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
|
||||
virDomainDiskBusTypeToString(dev->data.disk->bus));
|
||||
goto cleanup;
|
||||
}
|
||||
- if (driver->securityDriver)
|
||||
- driver->securityDriver->domainSetSecurityImageLabel(dom->conn, vm, dev->data.disk);
|
||||
break;
|
||||
|
||||
default:
|
||||
125
libvirt-0.6.2-hotplug-monitor-syntax.patch
Normal file
125
libvirt-0.6.2-hotplug-monitor-syntax.patch
Normal file
@@ -0,0 +1,125 @@
|
||||
commit 326ecb78145cfeb7706ef0dcd521b19d934950e7
|
||||
Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon Jul 6 15:58:55 2009 +0100
|
||||
|
||||
Fix PCI device hotplug/unplug with newer QEMU
|
||||
|
||||
* src/qemu_driver.c: Try new monitor syntax for hotplug first. If
|
||||
that fails fallback to old KVM specific syntax
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 2e55045..5a0ab12 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -4004,6 +4004,7 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
|
||||
char *cmd, *reply, *s;
|
||||
char *safe_path;
|
||||
const char* type = virDomainDiskBusTypeToString(dev->data.disk->bus);
|
||||
+ int tryOldSyntax = 0;
|
||||
|
||||
for (i = 0 ; i < vm->def->ndisks ; i++) {
|
||||
if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
|
||||
@@ -4018,14 +4019,15 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+try_command:
|
||||
safe_path = qemudEscapeMonitorArg(dev->data.disk->src);
|
||||
if (!safe_path) {
|
||||
virReportOOMError(conn);
|
||||
return -1;
|
||||
}
|
||||
|
||||
- ret = virAsprintf(&cmd, "pci_add 0 storage file=%s,if=%s",
|
||||
- safe_path, type);
|
||||
+ ret = virAsprintf(&cmd, "pci_add %s storage file=%s,if=%s",
|
||||
+ (tryOldSyntax ? "0": "pci_addr=auto"), safe_path, type);
|
||||
VIR_FREE(safe_path);
|
||||
if (ret == -1) {
|
||||
virReportOOMError(conn);
|
||||
@@ -4041,17 +4043,27 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
|
||||
|
||||
DEBUG ("%s: pci_add reply: %s", vm->def->name, reply);
|
||||
/* If the command succeeds qemu prints:
|
||||
- * OK bus 0... */
|
||||
-#define PCI_ATTACH_OK_MSG "OK bus 0, slot "
|
||||
- if ((s=strstr(reply, PCI_ATTACH_OK_MSG))) {
|
||||
- char* dummy = s;
|
||||
- s += strlen(PCI_ATTACH_OK_MSG);
|
||||
+ * OK bus 0, slot XXX...
|
||||
+ * or
|
||||
+ * OK domain 0, bus 0, slot XXX
|
||||
+ */
|
||||
+ if ((s = strstr(reply, "OK ")) &&
|
||||
+ (s = strstr(s, "slot "))) {
|
||||
+ char *dummy = s;
|
||||
+ s += strlen("slot ");
|
||||
|
||||
if (virStrToLong_i ((const char*)s, &dummy, 10, &dev->data.disk->slotnum) == -1)
|
||||
VIR_WARN("%s", _("Unable to parse slot number\n"));
|
||||
+ /* XXX not neccessarily always going to end up in domain 0 / bus 0 :-( */
|
||||
+ /* XXX this slotnum is not persistant across restarts :-( */
|
||||
+ } else if (!tryOldSyntax && strstr(reply, "invalid char in expression")) {
|
||||
+ VIR_FREE(reply);
|
||||
+ VIR_FREE(cmd);
|
||||
+ tryOldSyntax = 1;
|
||||
+ goto try_command;
|
||||
} else {
|
||||
qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
- _("adding %s disk failed"), type);
|
||||
+ _("adding %s disk failed: %s"), type, reply);
|
||||
VIR_FREE(reply);
|
||||
VIR_FREE(cmd);
|
||||
return -1;
|
||||
@@ -4268,6 +4280,7 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
|
||||
char *cmd = NULL;
|
||||
char *reply = NULL;
|
||||
virDomainDiskDefPtr detach = NULL;
|
||||
+ int tryOldSyntax = 0;
|
||||
|
||||
for (i = 0 ; i < vm->def->ndisks ; i++) {
|
||||
if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
|
||||
@@ -4289,9 +4302,17 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (virAsprintf(&cmd, "pci_del 0 %d", detach->slotnum) < 0) {
|
||||
- virReportOOMError(conn);
|
||||
- goto cleanup;
|
||||
+try_command:
|
||||
+ if (tryOldSyntax) {
|
||||
+ if (virAsprintf(&cmd, "pci_del 0 %d", detach->slotnum) < 0) {
|
||||
+ virReportOOMError(conn);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (virAsprintf(&cmd, "pci_del pci_addr=0:0:%d", detach->slotnum) < 0) {
|
||||
+ virReportOOMError(conn);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
|
||||
@@ -4301,12 +4322,19 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
|
||||
}
|
||||
|
||||
DEBUG ("%s: pci_del reply: %s",vm->def->name, reply);
|
||||
+
|
||||
+ if (!tryOldSyntax &&
|
||||
+ strstr(reply, "extraneous characters")) {
|
||||
+ tryOldSyntax = 1;
|
||||
+ goto try_command;
|
||||
+ }
|
||||
/* If the command fails due to a wrong slot qemu prints: invalid slot,
|
||||
* nothing is printed on success */
|
||||
- if (strstr(reply, "invalid slot")) {
|
||||
+ if (strstr(reply, "invalid slot") ||
|
||||
+ strstr(reply, "Invalid pci address")) {
|
||||
qemudReportError (conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
- _("failed to detach disk %s: invalid slot %d"),
|
||||
- detach->dst, detach->slotnum);
|
||||
+ _("failed to detach disk %s: invalid slot %d: %s"),
|
||||
+ detach->dst, detach->slotnum, reply);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
52
libvirt-0.6.2-monitor-prompt-discard.patch
Normal file
52
libvirt-0.6.2-monitor-prompt-discard.patch
Normal file
@@ -0,0 +1,52 @@
|
||||
commit 2d1f2e706c8b13571e1227df1c69b2302da35d5a
|
||||
Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon Jul 6 15:45:04 2009 +0100
|
||||
|
||||
Fix problem with QEMU monitor welcome prompt confusing libvirt
|
||||
after a libvirtd daemon restart with active guests
|
||||
|
||||
* src/qemu_driver: Read and dicard pending monitor data
|
||||
before issuing new monitor commands.
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index e2b7acb..2e55045 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1744,6 +1744,28 @@ cleanup:
|
||||
qemuDriverUnlock(driver);
|
||||
}
|
||||
|
||||
+
|
||||
+/* Throw away any data available on the monitor
|
||||
+ * This is done before executing a command, in order
|
||||
+ * to allow re-synchronization if something went badly
|
||||
+ * wrong in the past. it also deals with problem of
|
||||
+ * QEMU *sometimes* re-printing its initial greeting
|
||||
+ * when we reconnect to the monitor after restarts.
|
||||
+ */
|
||||
+static void
|
||||
+qemuMonitorDiscardPendingData(virDomainObjPtr vm) {
|
||||
+ char buf[1024];
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ /* Monitor is non-blocking, so just loop till we
|
||||
+ * get -1 or 0. Don't bother with detecting
|
||||
+ * errors, since we'll deal with that better later */
|
||||
+ do {
|
||||
+ ret = read(vm->monitor, buf, sizeof (buf)-1);
|
||||
+ } while (ret > 0);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
qemudMonitorCommandExtra(const virDomainObjPtr vm,
|
||||
const char *cmd,
|
||||
@@ -1755,6 +1777,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
|
||||
size_t cmdlen = strlen(cmd);
|
||||
size_t extralen = extra ? strlen(extra) : 0;
|
||||
|
||||
+ qemuMonitorDiscardPendingData(vm);
|
||||
+
|
||||
if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen)
|
||||
return -1;
|
||||
if (safewrite(vm->monitor, "\r", 1) != 1)
|
||||
133
libvirt-0.6.2-numa-ignore-fail.patch
Normal file
133
libvirt-0.6.2-numa-ignore-fail.patch
Normal file
@@ -0,0 +1,133 @@
|
||||
diff -rup libvirt-0.6.2.orig/src/capabilities.c libvirt-0.6.2.new/src/capabilities.c
|
||||
--- libvirt-0.6.2.orig/src/capabilities.c 2009-03-24 12:31:01.000000000 +0000
|
||||
+++ libvirt-0.6.2.new/src/capabilities.c 2009-08-13 12:10:57.000000000 +0100
|
||||
@@ -122,6 +122,18 @@ virCapabilitiesFreeGuest(virCapsGuestPtr
|
||||
}
|
||||
|
||||
|
||||
+void
|
||||
+virCapabilitiesFreeNUMAInfo(virCapsPtr caps)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0 ; i < caps->host.nnumaCell ; i++)
|
||||
+ virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]);
|
||||
+ VIR_FREE(caps->host.numaCell);
|
||||
+ caps->host.nnumaCell = 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/**
|
||||
* virCapabilitiesFree:
|
||||
* @caps: object to free
|
||||
@@ -141,9 +153,7 @@ virCapabilitiesFree(virCapsPtr caps) {
|
||||
for (i = 0 ; i < caps->host.nfeatures ; i++)
|
||||
VIR_FREE(caps->host.features[i]);
|
||||
VIR_FREE(caps->host.features);
|
||||
- for (i = 0 ; i < caps->host.nnumaCell ; i++)
|
||||
- virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]);
|
||||
- VIR_FREE(caps->host.numaCell);
|
||||
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||
|
||||
for (i = 0 ; i < caps->host.nmigrateTrans ; i++)
|
||||
VIR_FREE(caps->host.migrateTrans[i]);
|
||||
diff -rup libvirt-0.6.2.orig/src/capabilities.h libvirt-0.6.2.new/src/capabilities.h
|
||||
--- libvirt-0.6.2.orig/src/capabilities.h 2009-03-24 12:31:01.000000000 +0000
|
||||
+++ libvirt-0.6.2.new/src/capabilities.h 2009-08-13 11:50:46.000000000 +0100
|
||||
@@ -118,6 +118,9 @@ extern void
|
||||
virCapabilitiesFree(virCapsPtr caps);
|
||||
|
||||
extern void
|
||||
+virCapabilitiesFreeNUMAInfo(virCapsPtr caps);
|
||||
+
|
||||
+extern void
|
||||
virCapabilitiesSetMacPrefix(virCapsPtr caps,
|
||||
unsigned char *prefix);
|
||||
|
||||
diff -rup libvirt-0.6.2.orig/src/libvirt_private.syms libvirt-0.6.2.new/src/libvirt_private.syms
|
||||
--- libvirt-0.6.2.orig/src/libvirt_private.syms 2009-04-03 15:04:28.000000000 +0100
|
||||
+++ libvirt-0.6.2.new/src/libvirt_private.syms 2009-08-13 11:50:59.000000000 +0100
|
||||
@@ -24,6 +24,7 @@ virCapabilitiesDefaultGuestEmulator;
|
||||
virCapabilitiesDefaultGuestMachine;
|
||||
virCapabilitiesFormatXML;
|
||||
virCapabilitiesFree;
|
||||
+virCapabilitiesFreeNUMAInfo;
|
||||
virCapabilitiesNew;
|
||||
virCapabilitiesSetMacPrefix;
|
||||
virCapabilitiesGenerateMac;
|
||||
diff -rup libvirt-0.6.2.orig/src/lxc_conf.c libvirt-0.6.2.new/src/lxc_conf.c
|
||||
--- libvirt-0.6.2.orig/src/lxc_conf.c 2009-01-31 09:04:17.000000000 +0000
|
||||
+++ libvirt-0.6.2.new/src/lxc_conf.c 2009-08-13 11:58:41.000000000 +0100
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "lxc_conf.h"
|
||||
#include "nodeinfo.h"
|
||||
#include "virterror_internal.h"
|
||||
+#include "logging.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_LXC
|
||||
|
||||
@@ -46,8 +47,14 @@ virCapsPtr lxcCapsInit(void)
|
||||
0, 0)) == NULL)
|
||||
goto no_memory;
|
||||
|
||||
- if (virCapsInitNUMA(caps) < 0)
|
||||
- goto no_memory;
|
||||
+ /* Some machines have problematic NUMA toplogy causing
|
||||
+ * unexpected failures. We don't want to break the QEMU
|
||||
+ * driver in this scenario, so log errors & carry on
|
||||
+ */
|
||||
+ if (virCapsInitNUMA(caps) < 0) {
|
||||
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||
+ }
|
||||
|
||||
/* XXX shouldn't 'borrow' KVM's prefix */
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char []){ 0x52, 0x54, 0x00 });
|
||||
diff -rup libvirt-0.6.2.orig/src/qemu_conf.c libvirt-0.6.2.new/src/qemu_conf.c
|
||||
--- libvirt-0.6.2.orig/src/qemu_conf.c 2009-08-13 11:44:11.000000000 +0100
|
||||
+++ libvirt-0.6.2.new/src/qemu_conf.c 2009-08-13 11:45:34.000000000 +0100
|
||||
@@ -376,8 +376,14 @@ virCapsPtr qemudCapsInit(void) {
|
||||
/* Using KVM's mac prefix for QEMU too */
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x52, 0x54, 0x00 });
|
||||
|
||||
- if (virCapsInitNUMA(caps) < 0)
|
||||
- goto no_memory;
|
||||
+ /* Some machines have problematic NUMA toplogy causing
|
||||
+ * unexpected failures. We don't want to break the QEMU
|
||||
+ * driver in this scenario, so log errors & carry on
|
||||
+ */
|
||||
+ if (virCapsInitNUMA(caps) < 0) {
|
||||
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||
+ }
|
||||
|
||||
/* First the pure HVM guests */
|
||||
for (i = 0 ; i < ARRAY_CARDINALITY(arch_info_hvm) ; i++)
|
||||
diff -rup libvirt-0.6.2.orig/src/uml_conf.c libvirt-0.6.2.new/src/uml_conf.c
|
||||
--- libvirt-0.6.2.orig/src/uml_conf.c 2009-01-31 09:04:18.000000000 +0000
|
||||
+++ libvirt-0.6.2.new/src/uml_conf.c 2009-08-13 11:58:47.000000000 +0100
|
||||
@@ -44,6 +44,7 @@
|
||||
#include "memory.h"
|
||||
#include "nodeinfo.h"
|
||||
#include "verify.h"
|
||||
+#include "logging.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_UML
|
||||
|
||||
@@ -62,8 +63,14 @@ virCapsPtr umlCapsInit(void) {
|
||||
0, 0)) == NULL)
|
||||
goto no_memory;
|
||||
|
||||
- if (virCapsInitNUMA(caps) < 0)
|
||||
- goto no_memory;
|
||||
+ /* Some machines have problematic NUMA toplogy causing
|
||||
+ * unexpected failures. We don't want to break the QEMU
|
||||
+ * driver in this scenario, so log errors & carry on
|
||||
+ */
|
||||
+ if (virCapsInitNUMA(caps) < 0) {
|
||||
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||
+ }
|
||||
|
||||
if ((guest = virCapabilitiesAddGuest(caps,
|
||||
"uml",
|
||||
22
libvirt-0.6.2-pci-device-crash.patch
Normal file
22
libvirt-0.6.2-pci-device-crash.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
commit 4a7acedd3c59a6a750576cb8680bc3f08fe0b52c
|
||||
Author: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Thu Jul 16 13:23:32 2009 +0100
|
||||
|
||||
Fix free of unitialized data upon PCI open fail
|
||||
|
||||
diff --git a/src/pci.c b/src/pci.c
|
||||
index 3ffa0aa..4030a14 100644
|
||||
--- a/src/pci.c
|
||||
+++ b/src/pci.c
|
||||
@@ -834,10 +834,8 @@ pciReadDeviceID(pciDevice *dev, const char *id_name)
|
||||
dev->name, id_name);
|
||||
|
||||
/* ID string is '0xNNNN\n' ... i.e. 7 bytes */
|
||||
- if (virFileReadAll(path, 7, &id_str) < 7) {
|
||||
- VIR_FREE(id_str);
|
||||
+ if (virFileReadAll(path, 7, &id_str) < 0)
|
||||
return NULL;
|
||||
- }
|
||||
|
||||
/* Check for 0x suffix */
|
||||
if (id_str[0] != '0' || id_str[1] != 'x') {
|
||||
160
libvirt-0.6.2-qemu-name-uniqueness.patch
Normal file
160
libvirt-0.6.2-qemu-name-uniqueness.patch
Normal file
@@ -0,0 +1,160 @@
|
||||
diff -rupN libvirt-0.6.2/src/qemu_driver.c libvirt-0.6.2.new/src/qemu_driver.c
|
||||
--- libvirt-0.6.2/src/qemu_driver.c 2009-08-05 16:25:22.000000000 +0100
|
||||
+++ libvirt-0.6.2.new/src/qemu_driver.c 2009-08-05 16:27:48.000000000 +0100
|
||||
@@ -2174,22 +2174,37 @@ static virDomainPtr qemudDomainCreate(vi
|
||||
if (virSecurityDriverVerify(conn, def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- vm = virDomainFindByName(&driver->domains, def->name);
|
||||
- if (vm) {
|
||||
- qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
- _("domain '%s' is already defined"),
|
||||
- def->name);
|
||||
- goto cleanup;
|
||||
- }
|
||||
+ /* See if a VM with matching UUID already exists */
|
||||
vm = virDomainFindByUUID(&driver->domains, def->uuid);
|
||||
if (vm) {
|
||||
- char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ /* UUID matches, but if names don't match, refuse it */
|
||||
+ if (STRNEQ(vm->def->name, def->name)) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ vm->def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
|
||||
- virUUIDFormat(def->uuid, uuidstr);
|
||||
- qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
- _("domain with uuid '%s' is already defined"),
|
||||
- uuidstr);
|
||||
- goto cleanup;
|
||||
+ /* UUID & name match, but if VM is already active, refuse it */
|
||||
+ if (virDomainIsActive(vm)) {
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain is already active as '%s'"), vm->def->name);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ virDomainObjUnlock(vm);
|
||||
+ } else {
|
||||
+ /* UUID does not match, but if a name matches, refuse it */
|
||||
+ vm = virDomainFindByName(&driver->domains, def->name);
|
||||
+ if (vm) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!(vm = virDomainAssignDef(conn,
|
||||
@@ -2368,6 +2383,11 @@ static int qemudDomainDestroy(virDomainP
|
||||
_("no domain with matching id %d"), dom->id);
|
||||
goto cleanup;
|
||||
}
|
||||
+ if (!virDomainIsActive(vm)) {
|
||||
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ "%s", _("domain is not running"));
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
|
||||
qemudShutdownVMDaemon(dom->conn, driver, vm);
|
||||
event = virDomainEventNewFromObj(vm,
|
||||
@@ -3272,17 +3292,36 @@ static int qemudDomainRestore(virConnect
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- /* Ensure the name and UUID don't already exist in an active VM */
|
||||
+ /* See if a VM with matching UUID already exists */
|
||||
vm = virDomainFindByUUID(&driver->domains, def->uuid);
|
||||
- if (!vm)
|
||||
- vm = virDomainFindByName(&driver->domains, def->name);
|
||||
if (vm) {
|
||||
+ /* UUID matches, but if names don't match, refuse it */
|
||||
+ if (STRNEQ(vm->def->name, def->name)) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ vm->def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
+ /* UUID & name match, but if VM is already active, refuse it */
|
||||
if (virDomainIsActive(vm)) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
_("domain is already active as '%s'"), vm->def->name);
|
||||
goto cleanup;
|
||||
- } else {
|
||||
- virDomainObjUnlock(vm);
|
||||
+ }
|
||||
+ virDomainObjUnlock(vm);
|
||||
+ } else {
|
||||
+ /* UUID does not match, but if a name matches, refuse it */
|
||||
+ vm = virDomainFindByName(&driver->domains, def->name);
|
||||
+ if (vm) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3470,18 +3509,41 @@ static virDomainPtr qemudDomainDefine(vi
|
||||
if (virSecurityDriverVerify(conn, def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- vm = virDomainFindByName(&driver->domains, def->name);
|
||||
+ /* See if a VM with matching UUID already exists */
|
||||
+ vm = virDomainFindByUUID(&driver->domains, def->uuid);
|
||||
if (vm) {
|
||||
+ /* UUID matches, but if names don't match, refuse it */
|
||||
+ if (STRNEQ(vm->def->name, def->name)) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ vm->def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
+ /* UUID & name match */
|
||||
virDomainObjUnlock(vm);
|
||||
newVM = 0;
|
||||
+ } else {
|
||||
+ /* UUID does not match, but if a name matches, refuse it */
|
||||
+ vm = virDomainFindByName(&driver->domains, def->name);
|
||||
+ if (vm) {
|
||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
+ virUUIDFormat(vm->def->uuid, uuidstr);
|
||||
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
+ _("domain '%s' is already defined with uuid %s"),
|
||||
+ def->name, uuidstr);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!(vm = virDomainAssignDef(conn,
|
||||
&driver->domains,
|
||||
def))) {
|
||||
- virDomainDefFree(def);
|
||||
goto cleanup;
|
||||
}
|
||||
+ def = NULL;
|
||||
vm->persistent = 1;
|
||||
|
||||
if (virDomainSaveConfig(conn,
|
||||
@@ -3503,6 +3565,7 @@ static virDomainPtr qemudDomainDefine(vi
|
||||
if (dom) dom->id = vm->def->id;
|
||||
|
||||
cleanup:
|
||||
+ virDomainDefFree(def);
|
||||
if (vm)
|
||||
virDomainObjUnlock(vm);
|
||||
if (event)
|
||||
43
libvirt.spec
43
libvirt.spec
@@ -66,7 +66,7 @@
|
||||
Summary: Library providing a simple API virtualization
|
||||
Name: libvirt
|
||||
Version: 0.6.2
|
||||
Release: 12%{?dist}%{?extra_release}
|
||||
Release: 15%{?dist}%{?extra_release}
|
||||
License: LGPLv2+
|
||||
Group: Development/Libraries
|
||||
Source: libvirt-%{version}.tar.gz
|
||||
@@ -100,6 +100,24 @@ Patch12: libvirt-0.6.2-qemu-ppc-machine-type.patch
|
||||
Patch13: libvirt-0.6.2-libvirtd-double-free.patch
|
||||
# Fix broken networking with newer qemu releases (bz 503275)
|
||||
Patch14: libvirt-0.6.2-avoid-broken-networking-with-newer-qemu.patch
|
||||
# Fix libvirtd crash with bad capabilities data (bz 505635)
|
||||
Patch15: libvirt-0.6.2-fix-libvirtd-crash-with-bad-capabilities-data.patch
|
||||
# Don't unnecessarily try to change a file context (bug #507555)
|
||||
Patch16: libvirt-0.6.2-do-not-unnecessarily-try-to-change-a-file-context.patch
|
||||
# Misc useful fix
|
||||
Patch17: libvirt-0.6.2-monitor-prompt-discard.patch
|
||||
# rhbz #496442
|
||||
Patch18: libvirt-0.6.2-hotplug-labelling.patch
|
||||
# rhbz 499669
|
||||
Patch19: libvirt-0.6.2-hotplug-monitor-syntax.patch
|
||||
# rhbz #510907
|
||||
Patch20: libvirt-0.6.2-pci-device-crash.patch
|
||||
# rhbz #507405
|
||||
Patch21: libvirt-0.6.2-qemu-name-uniqueness.patch
|
||||
# rhbz #479517
|
||||
Patch22: libvirt-0.6.2-buf-locale-escape.patch
|
||||
# rhbz #506590
|
||||
Patch23: libvirt-0.6.2-numa-ignore-fail.patch
|
||||
|
||||
# Not for upstream. Temporary hack till PulseAudio autostart
|
||||
# problems are sorted out when SELinux enforcing
|
||||
@@ -266,6 +284,15 @@ of recent versions of Linux (and other OSes).
|
||||
%patch12 -p1
|
||||
%patch13 -p1
|
||||
%patch14 -p1
|
||||
%patch15 -p1
|
||||
%patch16 -p1
|
||||
%patch17 -p1
|
||||
%patch18 -p1
|
||||
%patch19 -p1
|
||||
%patch20 -p1
|
||||
%patch21 -p1
|
||||
%patch22 -p1
|
||||
%patch23 -p1
|
||||
|
||||
%patch200 -p0
|
||||
|
||||
@@ -589,6 +616,20 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Thu Aug 13 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.2-15.fc11
|
||||
- Log and ignore NUMA topology problems (rhbz #506590)
|
||||
|
||||
* Wed Aug 5 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.2-14.fc11
|
||||
- Fix crash when attaching/detaching non-existant PCI device (rhbz #510907)
|
||||
- Fix QEMU guest name/uuid uniqueness checks (rhbz #507405)
|
||||
- Fix to use correct pci_add/del syntax for QEMU (rhbz #499669)
|
||||
- Relabel disks before hotplugging them to guest (rhbz #496442)
|
||||
- Correctly handle 8-bit high bytes when escaping XML (rhbz #479517)
|
||||
|
||||
* Fri Jul 3 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-13.fc11
|
||||
- Fix libvirtd crash with bad capabilities data (bug #505635)
|
||||
- Don't unnecessarily try to change a file context (bug #507555)
|
||||
|
||||
* Fri Jun 5 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-12.fc11
|
||||
- Use the correct QEMU machine type for ppc (bug #502862)
|
||||
- Fix crash with TLS connections (bug #503066)
|
||||
|
||||
Reference in New Issue
Block a user