Compare commits
67 Commits
libvirt-0_
...
libvirt-0_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00ce651fb8 | ||
|
|
3c684a55ed | ||
|
|
b1ea570e48 | ||
|
|
6ccf4c1a0c | ||
|
|
dbaa6786af | ||
|
|
288291b795 | ||
|
|
7c2073faca | ||
|
|
5b528ba717 | ||
|
|
4f731a7250 | ||
|
|
f1ac0031f5 | ||
|
|
e45b9c9030 | ||
|
|
3cf75c269d | ||
|
|
585033f372 | ||
|
|
897506e66a | ||
|
|
e4bf8ffa42 | ||
|
|
20367a58a6 | ||
|
|
aa037364ed | ||
|
|
c034c1a3b2 | ||
|
|
da05e02884 | ||
|
|
e1b7b518ac | ||
|
|
581b5f5022 | ||
|
|
c476c8b683 | ||
|
|
b93eafc59f | ||
|
|
2105d62ca8 | ||
|
|
743adffffe | ||
|
|
11e3b51c0d | ||
|
|
66df925739 | ||
|
|
b20a5c6d3b | ||
|
|
7f58f3aa54 | ||
|
|
6577b14441 | ||
|
|
2e7812764f | ||
|
|
854b878580 | ||
|
|
89c28e4013 | ||
|
|
db269c2d21 | ||
|
|
98e4f7ee9f | ||
|
|
0c4afc5ee9 | ||
|
|
593255292e | ||
|
|
ccafc8ecb4 | ||
|
|
a38fb9cbc1 | ||
|
|
6359121866 | ||
|
|
b20d669e88 | ||
|
|
a3e1cc37ed | ||
|
|
a6eca3382d | ||
|
|
c6c5072e90 | ||
|
|
705fd20a0e | ||
|
|
e0e9927d93 | ||
|
|
bae7a0fb84 | ||
|
|
36aee593bc | ||
|
|
dc0cb0e91a | ||
|
|
84d66312fe | ||
|
|
4f644ce267 | ||
|
|
cdd5b3d62d | ||
|
|
53f63aa62d | ||
|
|
748df35c5f | ||
|
|
a6e23d00fa | ||
|
|
c6d11b43c9 | ||
|
|
83091ff0dd | ||
|
|
4465a63872 | ||
|
|
3f397d9786 | ||
|
|
750aec5507 | ||
|
|
d7c1d3bbc0 | ||
|
|
fa0f21c263 | ||
|
|
afdaf5d354 | ||
|
|
26bba5aea9 | ||
|
|
1a4185bdcc | ||
|
|
6a73119e65 | ||
|
|
1e2f9fce0a |
@@ -6,3 +6,8 @@ libvirt-*.tar.gz
|
||||
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
|
||||
libvirt-0.6.5.tar.gz
|
||||
libvirt-0.7.0.tar.gz
|
||||
libvirt-0.7.1.tar.gz
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
From 934b71abf1b908f720811a44ad5411cfc1a4ca37 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Thu, 28 May 2009 13:15:57 +0000
|
||||
Subject: [PATCH 1/1] Avoid broken networking with new QEMU/KVM >= 86
|
||||
|
||||
---
|
||||
src/qemu_conf.c | 4 ++--
|
||||
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index 93dc0b7..a04d216 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -658,8 +658,8 @@ qemudNetworkIfaceConnect(virConnectPtr conn,
|
||||
}
|
||||
|
||||
snprintf(tapfdstr, sizeof(tapfdstr),
|
||||
- "tap,fd=%d,script=,vlan=%d,ifname=%s",
|
||||
- tapfd, vlan, net->ifname);
|
||||
+ "tap,fd=%d,vlan=%d",
|
||||
+ tapfd, vlan);
|
||||
|
||||
if (!(retval = strdup(tapfdstr)))
|
||||
goto no_memory;
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
From 4db7474b0c1907e877d7206edeb4d73962971096 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
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
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
From fbd16cecc72494e8a9450f38197221f2f50c9d0e Mon Sep 17 00:00:00 2001
|
||||
From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
|
||||
Date: Thu, 16 Apr 2009 15:56:27 +0000
|
||||
Subject: [PATCH 1/1] Don't log monitor output to domain log file.
|
||||
|
||||
It's logged via the logging system already. Prefix monitor debug output with vm
|
||||
name.
|
||||
---
|
||||
src/qemu_driver.c | 60 +++++++++++++++++++++-------------------------------
|
||||
1 files changed, 24 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 79ee072..f5b5fa5 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -1710,27 +1710,11 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
-
|
||||
- /* Log, but ignore failures to write logfile for VM */
|
||||
- if (safewrite(vm->logfile, buf, strlen(buf)) < 0) {
|
||||
- char ebuf[1024];
|
||||
- VIR_WARN(_("Unable to log VM console data: %s\n"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- }
|
||||
-
|
||||
*reply = buf;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
- if (buf) {
|
||||
- /* Log, but ignore failures to write logfile for VM */
|
||||
- if (safewrite(vm->logfile, buf, strlen(buf)) < 0) {
|
||||
- char ebuf[1024];
|
||||
- VIR_WARN(_("Unable to log VM console data: %s\n"),
|
||||
- virStrerror(errno, ebuf, sizeof ebuf));
|
||||
- }
|
||||
- VIR_FREE(buf);
|
||||
- }
|
||||
+ VIR_FREE(buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2463,7 +2447,7 @@ static int qemudDomainGetMemoryBalloon(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("balloon reply: '%s'", reply);
|
||||
+ DEBUG ("%s: balloon reply: '%s'", vm->def->name, reply);
|
||||
if ((offset = strstr(reply, BALLOON_PREFIX)) != NULL) {
|
||||
unsigned int memMB;
|
||||
char *end;
|
||||
@@ -2517,7 +2501,7 @@ static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
|
||||
|
||||
/* If the command failed qemu prints: 'unknown command'
|
||||
* No message is printed on success it seems */
|
||||
- DEBUG ("balloon reply: %s", reply);
|
||||
+ DEBUG ("%s: balloon reply: %s",vm->def->name, reply);
|
||||
if (strstr(reply, "\nunknown command:")) {
|
||||
/* Don't set error - it is expected memory balloon fails on many qemu */
|
||||
ret = 0;
|
||||
@@ -2812,7 +2796,7 @@ static int qemudDomainSave(virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("migrate reply: %s", info);
|
||||
+ DEBUG ("%s: migrate reply: %s", vm->def->name, info);
|
||||
|
||||
/* If the command isn't supported then qemu prints:
|
||||
* unknown command: migrate" */
|
||||
@@ -3658,7 +3642,7 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
|
||||
/* If the command failed qemu prints:
|
||||
* device not found, device is locked ...
|
||||
* No message is printed on success it seems */
|
||||
- DEBUG ("ejectable media change reply: %s", reply);
|
||||
+ DEBUG ("%s: ejectable media change reply: %s", vm->def->name, reply);
|
||||
if (strstr(reply, "\ndevice ")) {
|
||||
qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
_("changing cdrom media failed: %s"), reply);
|
||||
@@ -3719,7 +3703,7 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("pci_add reply: %s", reply);
|
||||
+ 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 "
|
||||
@@ -3787,7 +3771,7 @@ static int qemudDomainAttachUsbMassstorageDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("attach_usb reply: %s", reply);
|
||||
+ DEBUG ("%s: attach_usb reply: %s",vm->def->name, reply);
|
||||
/* If the command failed qemu prints:
|
||||
* Could not add ... */
|
||||
if (strstr(reply, "Could not add ")) {
|
||||
@@ -3841,7 +3825,7 @@ static int qemudDomainAttachHostDevice(virConnectPtr conn,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- DEBUG ("attach_usb reply: %s", reply);
|
||||
+ DEBUG ("%s: attach_usb reply: %s", vm->def->name, reply);
|
||||
/* If the command failed qemu prints:
|
||||
* Could not add ... */
|
||||
if (strstr(reply, "Could not add ")) {
|
||||
@@ -3980,7 +3964,7 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("pci_del reply: %s", reply);
|
||||
+ DEBUG ("%s: pci_del reply: %s",vm->def->name, reply);
|
||||
/* If the command fails due to a wrong slot qemu prints: invalid slot,
|
||||
* nothing is printed on success */
|
||||
if (strstr(reply, "invalid slot")) {
|
||||
@@ -4210,7 +4194,7 @@ qemudDomainBlockStats (virDomainPtr dom,
|
||||
"%s", _("'info blockstats' command failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
- DEBUG ("info blockstats reply: %s", info);
|
||||
+ DEBUG ("%s: info blockstats reply: %s", vm->def->name, info);
|
||||
|
||||
/* If the command isn't supported then qemu prints the supported
|
||||
* info commands, so the output starts "info ". Since this is
|
||||
@@ -4251,21 +4235,25 @@ qemudDomainBlockStats (virDomainPtr dom,
|
||||
if (STRPREFIX (p, "rd_bytes=")) {
|
||||
p += 9;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->rd_bytes) == -1)
|
||||
- DEBUG ("error reading rd_bytes: %s", p);
|
||||
+ DEBUG ("%s: error reading rd_bytes: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "wr_bytes=")) {
|
||||
p += 9;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->wr_bytes) == -1)
|
||||
- DEBUG ("error reading wr_bytes: %s", p);
|
||||
+ DEBUG ("%s: error reading wr_bytes: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "rd_operations=")) {
|
||||
p += 14;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->rd_req) == -1)
|
||||
- DEBUG ("error reading rd_req: %s", p);
|
||||
+ DEBUG ("%s: error reading rd_req: %s",
|
||||
+ vm->def->name, p);
|
||||
} else if (STRPREFIX (p, "wr_operations=")) {
|
||||
p += 14;
|
||||
if (virStrToLong_ll (p, &dummy, 10, &stats->wr_req) == -1)
|
||||
- DEBUG ("error reading wr_req: %s", p);
|
||||
+ DEBUG ("%s: error reading wr_req: %s",
|
||||
+ vm->def->name, p);
|
||||
} else
|
||||
- DEBUG ("unknown block stat near %s", p);
|
||||
+ DEBUG ("%s: unknown block stat near %s", vm->def->name, p);
|
||||
|
||||
/* Skip to next label. */
|
||||
p = strchr (p, ' ');
|
||||
@@ -4477,7 +4465,7 @@ qemudDomainMemoryPeek (virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("memsave reply: %s", info);
|
||||
+ DEBUG ("%s: memsave reply: %s", vm->def->name, info);
|
||||
|
||||
/* Read the memory file into buffer. */
|
||||
if (saferead (fd, buffer, size) == (ssize_t) -1) {
|
||||
@@ -4794,7 +4782,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
"%s", _("off-line migration specified, but suspend operation failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
- DEBUG ("stop reply: %s", info);
|
||||
+ DEBUG ("%s: stop reply: %s", vm->def->name, info);
|
||||
VIR_FREE(info);
|
||||
paused = 1;
|
||||
|
||||
@@ -4811,7 +4799,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
snprintf (cmd, sizeof cmd, "migrate_set_speed %lum", resource);
|
||||
qemudMonitorCommand (vm, cmd, &info);
|
||||
|
||||
- DEBUG ("migrate_set_speed reply: %s", info);
|
||||
+ DEBUG ("%s: migrate_set_speed reply: %s", vm->def->name, info);
|
||||
VIR_FREE (info);
|
||||
}
|
||||
|
||||
@@ -4830,7 +4818,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- DEBUG ("migrate reply: %s", info);
|
||||
+ DEBUG ("%s: migrate reply: %s", vm->def->name, info);
|
||||
|
||||
/* Now check for "fail" in the output string */
|
||||
if (strstr(info, "fail") != NULL) {
|
||||
@@ -4869,7 +4857,7 @@ cleanup:
|
||||
vm->def->name);
|
||||
}
|
||||
else {
|
||||
- DEBUG ("cont reply: %s", info);
|
||||
+ DEBUG ("%s: cont reply: %s", vm->def->name, info);
|
||||
VIR_FREE(info);
|
||||
}
|
||||
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||
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
|
||||
@@ -472,16 +472,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;
|
||||
@@ -489,6 +486,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)
|
||||
|
||||
|
||||
--
|
||||
@@ -1,144 +0,0 @@
|
||||
From e7be6cc841a5652b73ddd2ccd3769c7f8bbad13d Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
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
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
From 6483ee77ed12f037d68a6adc690624fa1b508dc0 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
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
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff -rup libvirt-0.6.2/src/security_selinux.c new/src/security_selinux.c
|
||||
--- libvirt-0.6.2/src/security_selinux.c 2009-05-10 22:04:25.000000000 -0400
|
||||
+++ new/src/security_selinux.c 2009-05-10 22:06:09.000000000 -0400
|
||||
@@ -338,6 +338,9 @@ SELinuxSetSecurityImageLabel(virConnectP
|
||||
{
|
||||
const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
|
||||
|
||||
+ if (!disk->src)
|
||||
+ return 0;
|
||||
+
|
||||
if (disk->shared) {
|
||||
return SELinuxSetFilecon(conn, disk->src, default_image_context);
|
||||
} else if (disk->readonly) {
|
||||
@@ -1,82 +0,0 @@
|
||||
From 2b3fcdc378e7bec5c1a78b81632756e92930fd24 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
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
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
From c3b3f6005d45552d01823504925eb587889cf25a Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Fri, 29 May 2009 14:34:35 +0000
|
||||
Subject: [PATCH 1/1] Avoid double-free in daemon client cleanup code
|
||||
|
||||
---
|
||||
qemud/qemud.c | 22 +++++++++++++++++-----
|
||||
1 files changed, 17 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/qemud/qemud.c b/qemud/qemud.c
|
||||
index 1375560..783dc69 100644
|
||||
--- a/qemud/qemud.c
|
||||
+++ b/qemud/qemud.c
|
||||
@@ -1397,7 +1397,10 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
|
||||
* jobs have finished, then clean it up elsehwere
|
||||
*/
|
||||
void qemudDispatchClientFailure(struct qemud_client *client) {
|
||||
- virEventRemoveHandleImpl(client->watch);
|
||||
+ if (client->watch != -1) {
|
||||
+ virEventRemoveHandleImpl(client->watch);
|
||||
+ client->watch = -1;
|
||||
+ }
|
||||
|
||||
/* Deregister event delivery callback */
|
||||
if(client->conn) {
|
||||
@@ -1406,12 +1406,21 @@ void qemudDispatchClientFailure(struct qemud_client *client) {
|
||||
}
|
||||
|
||||
#if HAVE_SASL
|
||||
- if (client->saslconn) sasl_dispose(&client->saslconn);
|
||||
+ if (client->saslconn) {
|
||||
+ sasl_dispose(&client->saslconn);
|
||||
+ client->saslconn = NULL;
|
||||
+ }
|
||||
free(client->saslUsername);
|
||||
+ client->saslUsername = NULL;
|
||||
#endif
|
||||
- if (client->tlssession) gnutls_deinit (client->tlssession);
|
||||
- close(client->fd);
|
||||
- client->fd = -1;
|
||||
+ if (client->tlssession) {
|
||||
+ gnutls_deinit (client->tlssession);
|
||||
+ client->tlssession = NULL;
|
||||
+ }
|
||||
+ if (client->fd != -1) {
|
||||
+ close(client->fd);
|
||||
+ client->fd = -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
From 0ae4c67ff5f1d24698c5cfc8a9719d333c892644 Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Thu, 16 Apr 2009 11:23:55 +0100
|
||||
Subject: [PATCH 1/3] qemu -drive takes format= not fmt=
|
||||
|
||||
Seems like a simple typo - it has been "format=" since the flag
|
||||
was introduced, but we added it as "fmt=".
|
||||
|
||||
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
||||
---
|
||||
src/qemu_conf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index f36c927..6f9e610 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -1135,7 +1135,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
|
||||
virBufferAddLit(&opt, ",boot=on");
|
||||
if (disk->driverType)
|
||||
- virBufferVSprintf(&opt, ",fmt=%s", disk->driverType);
|
||||
+ virBufferVSprintf(&opt, ",format=%s", disk->driverType);
|
||||
|
||||
if (disk->cachemode) {
|
||||
const char *mode =
|
||||
@@ -1,57 +0,0 @@
|
||||
From daf3db93457427c25325781af684758c0341a6aa Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
Date: Fri, 29 May 2009 13:32:06 +0000
|
||||
Subject: [PATCH 1/1] PPC Qemu Machine Type update
|
||||
* src/qemu_conf.c docs/schemas/domain.rng
|
||||
tests/capabilityschemadata/caps-qemu-kvm.xml: PPC Qemu Machine Type
|
||||
changed from g3bw to g3beige some time ago, patch by Thomas Baker
|
||||
Daniel
|
||||
|
||||
---
|
||||
docs/schemas/domain.rng | 2 +-
|
||||
src/qemu_conf.c | 2 +-
|
||||
tests/capabilityschemadata/caps-qemu-kvm.xml | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
|
||||
index 204c633..11cf04a 100644
|
||||
--- a/docs/schemas/domain.rng
|
||||
+++ b/docs/schemas/domain.rng
|
||||
@@ -184,7 +184,7 @@
|
||||
</attribute>
|
||||
<attribute name="machine">
|
||||
<choice>
|
||||
- <value>g3bw</value>
|
||||
+ <value>g3beige</value>
|
||||
<value>mac99</value>
|
||||
<value>prep</value>
|
||||
</choice>
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index 18156cd..d54f2ca 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -192,7 +192,7 @@ static const char *const arch_info_hvm_sparc_machines[] = {
|
||||
"sun4m"
|
||||
};
|
||||
static const char *const arch_info_hvm_ppc_machines[] = {
|
||||
- "g3bw", "mac99", "prep"
|
||||
+ "g3beige", "mac99", "prep"
|
||||
};
|
||||
|
||||
static const char *const arch_info_xen_x86_machines[] = {
|
||||
diff --git a/tests/capabilityschemadata/caps-qemu-kvm.xml b/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
index fd8523e..893f9ed 100644
|
||||
--- a/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
+++ b/tests/capabilityschemadata/caps-qemu-kvm.xml
|
||||
@@ -81,7 +81,7 @@
|
||||
<arch name='ppc'>
|
||||
<wordsize>32</wordsize>
|
||||
<emulator>/usr/bin/qemu-system-ppc</emulator>
|
||||
- <machine>g3bw</machine>
|
||||
+ <machine>g3beige</machine>
|
||||
<machine>mac99</machine>
|
||||
<machine>prep</machine>
|
||||
<domain type='qemu'>
|
||||
--
|
||||
1.6.0.6
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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 (vm->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 (vm->def->nsounds) {
|
||||
+ if (vm->def->nsounds &&
|
||||
+ !skipSound) {
|
||||
int size = 100;
|
||||
char *modstr;
|
||||
if (VIR_ALLOC_N(modstr, size+1) < 0)
|
||||
@@ -1,47 +0,0 @@
|
||||
From 7f7a4403860f56d5a1ad65bfd16f5bf97a971d45 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
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
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From 3d7771e0570e09096ad9391a857dad48b150bc0c Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Wed, 6 May 2009 16:33:28 +0100
|
||||
Subject: [PATCH] Fix qemu driver's interpretation of <hostdev managed='yes'/>
|
||||
|
||||
This change:
|
||||
|
||||
Tue Mar 3 08:55:13 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
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 <markmc@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
commit 0e51348cb9aeafe5e2fd6469a4bde0baa1eb8720
|
||||
Author: Cole Robinson <crobinso@redhat.com>
|
||||
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 */
|
||||
34
libvirt-change-logrotate-config-to-weekly.patch
Normal file
34
libvirt-change-logrotate-config-to-weekly.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
From bcd4180124afa20580d720912e2179b3a2f9295a Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Veillard <veillard@redhat.com>
|
||||
Date: Mon, 5 Oct 2009 17:03:14 +0200
|
||||
Subject: [PATCH] 526769 change logrotate config default to weekly
|
||||
|
||||
* daemon/libvirtd.logrotate.in: change to weekly rotation of logs,
|
||||
keep a month worth of data and also extend to cover LXC and UML
|
||||
domain logs
|
||||
|
||||
(cherry picked from commit 529325bbdd050af89bda5a5c1a01b5553c49a57e)
|
||||
|
||||
Fedora-patch: libvirt-change-logrotate-config-to-weekly.patch
|
||||
---
|
||||
qemud/libvirtd.logrotate.in | 6 +++---
|
||||
1 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/qemud/libvirtd.logrotate.in b/qemud/libvirtd.logrotate.in
|
||||
index 9b42630..093651c 100644
|
||||
--- a/qemud/libvirtd.logrotate.in
|
||||
+++ b/qemud/libvirtd.logrotate.in
|
||||
@@ -1,7 +1,7 @@
|
||||
-@localstatedir@/log/libvirt/qemu/*.log {
|
||||
- daily
|
||||
+@localstatedir@/log/libvirt/qemu/*.log @localstatedir@/log/libvirt/uml/*.log @localstatedir@/log/libvirt/lxc/*.log {
|
||||
+ weekly
|
||||
missingok
|
||||
- rotate 7
|
||||
+ rotate 4
|
||||
compress
|
||||
delaycompress
|
||||
copytruncate
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
77
libvirt-disable-audio-backend.patch
Normal file
77
libvirt-disable-audio-backend.patch
Normal file
@@ -0,0 +1,77 @@
|
||||
From 4721ceb9b85daabe53804627473b06ced821c695 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel P. Berrange <berrange@redhat.com>
|
||||
Date: Mon, 14 Sep 2009 11:23:20 +0100
|
||||
Subject: [PATCH] Allow control over QEMU audio backend
|
||||
|
||||
When using VNC for graphics + keyboard + mouse, we shouldn't
|
||||
then use the host OS for audio. Audio should go back over
|
||||
VNC.
|
||||
|
||||
When using SDL for graphics, we should use the host OS for
|
||||
audio since that's where the display is. We need to allow
|
||||
certain QEMU env variables to be passed through to guest
|
||||
too to allow choice of QEMU audio backend.
|
||||
|
||||
* qemud/libvirtd.sysconf: Mention QEMU/SDL audio env vars
|
||||
* src/qemu_conf.c: Passthrough QEMU/SDL audio env for SDL display,
|
||||
disable host audio for VNC display
|
||||
|
||||
(cherry picked from commit b08e6d38ae7a0ed70300d7d82107f83fddb60f44)
|
||||
|
||||
Fedora-patch: libvirt-disable-audio-backend.patch
|
||||
---
|
||||
qemud/libvirtd.sysconf | 8 ++++++++
|
||||
src/qemu_conf.c | 14 ++++++++++++++
|
||||
2 files changed, 22 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/qemud/libvirtd.sysconf b/qemud/libvirtd.sysconf
|
||||
index fe4596a..28080a0 100644
|
||||
--- a/qemud/libvirtd.sysconf
|
||||
+++ b/qemud/libvirtd.sysconf
|
||||
@@ -7,3 +7,11 @@
|
||||
|
||||
# Override Kerberos service keytab for SASL/GSSAPI
|
||||
#KRB5_KTNAME=/etc/libvirt/krb5.tab
|
||||
+
|
||||
+# Override the QEMU/SDL default audio driver probing when
|
||||
+# starting virtual machines using SDL graphics
|
||||
+#
|
||||
+# NB these have no effect for VMs using VNC
|
||||
+#QEMU_AUDIO_DRV=sdl
|
||||
+#
|
||||
+#SDL_AUDIODRIVER=pulse
|
||||
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||
index f92bcef..0dd0624 100644
|
||||
--- a/src/qemu_conf.c
|
||||
+++ b/src/qemu_conf.c
|
||||
@@ -2109,6 +2109,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
ADD_ARG_LIT("-k");
|
||||
ADD_ARG_LIT(def->graphics[0]->data.vnc.keymap);
|
||||
}
|
||||
+
|
||||
+ /* QEMU implements a VNC extension for providing audio, so we
|
||||
+ * set the audio backend to none, to prevent it opening the
|
||||
+ * host OS audio devices since that causes security issues
|
||||
+ * and is non-sensical when using VNC.
|
||||
+ */
|
||||
+ ADD_ENV_LIT("QEMU_AUDIO_DRV=none");
|
||||
} else if ((def->ngraphics == 1) &&
|
||||
def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
char *xauth = NULL;
|
||||
@@ -2131,6 +2138,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
ADD_ENV(display);
|
||||
if (def->graphics[0]->data.sdl.fullscreen)
|
||||
ADD_ARG_LIT("-full-screen");
|
||||
+
|
||||
+ /* If using SDL for video, then we should just let it
|
||||
+ * use QEMU's host audio drivers, possibly SDL too
|
||||
+ * User can set these two before starting libvirtd
|
||||
+ */
|
||||
+ ADD_ENV_COPY("QEMU_AUDIO_DRV");
|
||||
+ ADD_ENV_COPY("SDL_AUDIODRIVER");
|
||||
}
|
||||
|
||||
if (def->nvideos) {
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
32
libvirt-fix-drv-supports-feature-bogus-error.patch
Normal file
32
libvirt-fix-drv-supports-feature-bogus-error.patch
Normal file
@@ -0,0 +1,32 @@
|
||||
From 7692e1e19487c28454b1e5f6488d5574c70883f2 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Lalancette <clalance@redhat.com>
|
||||
Date: Mon, 21 Sep 2009 14:53:31 +0200
|
||||
Subject: [PATCH] Don't do virSetConnError when virDrvSupportsFeature is successful.
|
||||
|
||||
Signed-off-by: Chris Lalancette <clalance@redhat.com>
|
||||
Fedora-patch: libvirt-fix-drv-supports-feature-bogus-error.patch
|
||||
---
|
||||
src/libvirt.c | 7 +++++--
|
||||
1 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/libvirt.c b/src/libvirt.c
|
||||
index 4a11688..fa59dc7 100644
|
||||
--- a/src/libvirt.c
|
||||
+++ b/src/libvirt.c
|
||||
@@ -1349,8 +1349,11 @@ virDrvSupportsFeature (virConnectPtr conn, int feature)
|
||||
}
|
||||
|
||||
ret = VIR_DRV_SUPPORTS_FEATURE (conn->driver, conn, feature);
|
||||
- /* Copy to connection error object for back compatability */
|
||||
- virSetConnError(conn);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ /* Copy to connection error object for back compatability */
|
||||
+ virSetConnError(conn);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
46
libvirt-fix-net-hotunplug-double-free.patch
Normal file
46
libvirt-fix-net-hotunplug-double-free.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
From ba585ed6cff624c6c0f1f9801382fd6846466ee0 Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Thu, 17 Sep 2009 15:31:08 +0100
|
||||
Subject: [PATCH] Fix net/disk hot-unplug segfault
|
||||
|
||||
When we hot-unplug the last device, we're currently double-freeing
|
||||
the device definition.
|
||||
|
||||
Reported by Michal Nowak here:
|
||||
|
||||
https://bugzilla.redhat.com/523953
|
||||
|
||||
* src/qemu_driver.c: fix double free
|
||||
|
||||
(cherry-picked from commit 8881ae1bf8783006777429403cc543c33187175d)
|
||||
|
||||
Fedora-patch: libvirt-fix-net-hotunplug-double-free.patch
|
||||
---
|
||||
src/qemu_driver.c | 4 ++--
|
||||
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index a65334f..de31581 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -5998,7 +5998,7 @@ try_command:
|
||||
/* ignore, harmless */
|
||||
}
|
||||
} else {
|
||||
- VIR_FREE(vm->def->disks[0]);
|
||||
+ VIR_FREE(vm->def->disks);
|
||||
vm->def->ndisks = 0;
|
||||
}
|
||||
virDomainDiskDefFree(detach);
|
||||
@@ -6100,7 +6100,7 @@ qemudDomainDetachNetDevice(virConnectPtr conn,
|
||||
/* ignore, harmless */
|
||||
}
|
||||
} else {
|
||||
- VIR_FREE(vm->def->nets[0]);
|
||||
+ VIR_FREE(vm->def->nets);
|
||||
vm->def->nnets = 0;
|
||||
}
|
||||
virDomainNetDefFree(detach);
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
50
libvirt-fix-pci-hostdev-hotunplug-leak.patch
Normal file
50
libvirt-fix-pci-hostdev-hotunplug-leak.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 17831d20051f8de8f1f7d661e8a23f4fe67c2153 Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Thu, 17 Sep 2009 15:32:45 +0100
|
||||
Subject: [PATCH] Fix leak in PCI hostdev hot-unplug
|
||||
|
||||
* src/qemu_driver.c: sync the hostdev hot-unplug code with the disk/net
|
||||
code.
|
||||
|
||||
(cherry-picked from commit a70da51ff76ed860bfc0cdee2e1d556da997c557)
|
||||
|
||||
Fedora-patch: libvirt-fix-pci-hostdev-hotunplug-leak.patch
|
||||
---
|
||||
src/qemu_driver.c | 20 +++++++++++++-------
|
||||
1 files changed, 13 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index de31581..2ddcdc0 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -6206,14 +6206,20 @@ static int qemudDomainDetachHostPciDevice(virConnectPtr conn,
|
||||
pciFreeDevice(conn, pci);
|
||||
}
|
||||
|
||||
- if (i != --vm->def->nhostdevs)
|
||||
- memmove(&vm->def->hostdevs[i],
|
||||
- &vm->def->hostdevs[i+1],
|
||||
- sizeof(*vm->def->hostdevs) * (vm->def->nhostdevs-i));
|
||||
- if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs) < 0) {
|
||||
- virReportOOMError(conn);
|
||||
- ret = -1;
|
||||
+ if (vm->def->nhostdevs > 1) {
|
||||
+ memmove(vm->def->hostdevs + i,
|
||||
+ vm->def->hostdevs + i + 1,
|
||||
+ sizeof(*vm->def->hostdevs) *
|
||||
+ (vm->def->nhostdevs - (i + 1)));
|
||||
+ vm->def->nhostdevs--;
|
||||
+ if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs) < 0) {
|
||||
+ /* ignore, harmless */
|
||||
+ }
|
||||
+ } else {
|
||||
+ VIR_FREE(vm->def->hostdevs);
|
||||
+ vm->def->nhostdevs = 0;
|
||||
}
|
||||
+ virDomainHostdevDefFree(detach);
|
||||
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
53
libvirt-fix-qemu-raw-format-save.patch
Normal file
53
libvirt-fix-qemu-raw-format-save.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From f1be5a4714e194a84840343e0937fe62463a18dc Mon Sep 17 00:00:00 2001
|
||||
From: Charles Duffy <Charles_Duffy@dell.com>
|
||||
Date: Fri, 18 Sep 2009 11:32:35 -0500
|
||||
Subject: [PATCH] Prevent attempt to call cat -c during virDomainSave to raw
|
||||
|
||||
Fedora-patch: libvirt-fix-qemu-raw-format-save.patch
|
||||
---
|
||||
src/qemu_driver.c | 28 ++++++++++++++++++----------
|
||||
1 files changed, 18 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||
index 2ddcdc0..7c7b985 100644
|
||||
--- a/src/qemu_driver.c
|
||||
+++ b/src/qemu_driver.c
|
||||
@@ -3905,17 +3905,25 @@ static int qemudDomainSave(virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- const char *prog = qemudSaveCompressionTypeToString(header.compressed);
|
||||
- if (prog == NULL) {
|
||||
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
- _("Invalid compress format %d"), header.compressed);
|
||||
- goto cleanup;
|
||||
- }
|
||||
+ {
|
||||
+ const char *prog = qemudSaveCompressionTypeToString(header.compressed);
|
||||
+ const char *args;
|
||||
|
||||
- if (STREQ (prog, "raw"))
|
||||
- prog = "cat";
|
||||
- internalret = virAsprintf(&command, "migrate \"exec:"
|
||||
- "%s -c >> '%s' 2>/dev/null\"", prog, safe_path);
|
||||
+ if (prog == NULL) {
|
||||
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
+ _("Invalid compress format %d"), header.compressed);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
+ if (STREQ (prog, "raw")) {
|
||||
+ prog = "cat";
|
||||
+ args = "";
|
||||
+ } else {
|
||||
+ args = "-c";
|
||||
+ }
|
||||
+ internalret = virAsprintf(&command, "migrate \"exec:"
|
||||
+ "%s %s >> '%s' 2>/dev/null\"", prog, args, safe_path);
|
||||
+ }
|
||||
|
||||
if (internalret < 0) {
|
||||
virReportOOMError(dom->conn);
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
41
libvirt-fix-usb-device-passthrough.patch
Normal file
41
libvirt-fix-usb-device-passthrough.patch
Normal file
@@ -0,0 +1,41 @@
|
||||
From 6b12148864cf6a1d22a2cf4e0e9c48e9946331cb Mon Sep 17 00:00:00 2001
|
||||
From: Mark McLoughlin <markmc@redhat.com>
|
||||
Date: Wed, 30 Sep 2009 18:37:03 +0100
|
||||
Subject: [PATCH] Fix USB device re-labelling
|
||||
|
||||
A simple misplaced break out of a switch results in:
|
||||
|
||||
libvir: error : Failed to open file '/sys/bus/pci/devices/0000:00:54c./vendor': No such file or directory
|
||||
libvir: error : Failed to open file '/sys/bus/pci/devices/0000:00:54c./device': No such file or directory
|
||||
libvir: error : this function is not supported by the hypervisor: Failed to read product/vendor ID for 0000:00:54c.
|
||||
|
||||
when trying to passthrough a USB host device to qemu.
|
||||
|
||||
* src/security_selinux.c: fix a switch/break thinko
|
||||
|
||||
Fedora-patch: libvirt-fix-usb-device-passthrough.patch
|
||||
---
|
||||
src/security_selinux.c | 3 +--
|
||||
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/security_selinux.c b/src/security_selinux.c
|
||||
index bc295b1..b4dc153 100644
|
||||
--- a/src/security_selinux.c
|
||||
+++ b/src/security_selinux.c
|
||||
@@ -464,12 +464,11 @@ SELinuxSetSecurityHostdevLabel(virConnectPtr conn,
|
||||
|
||||
ret = usbDeviceFileIterate(conn, usb, SELinuxSetSecurityUSBLabel, vm);
|
||||
usbFreeDevice(conn, usb);
|
||||
-
|
||||
- break;
|
||||
} else {
|
||||
/* XXX deal with product/vendor better */
|
||||
ret = 0;
|
||||
}
|
||||
+ break;
|
||||
}
|
||||
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: {
|
||||
--
|
||||
1.6.2.5
|
||||
|
||||
1402
libvirt-svirt-relabel-qcow2-backing-files.patch
Normal file
1402
libvirt-svirt-relabel-qcow2-backing-files.patch
Normal file
File diff suppressed because it is too large
Load Diff
846
libvirt.spec
846
libvirt.spec
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user