Compare commits
139 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e59fd390c | |||
| 66c6e81b12 | |||
| 397698b913 | |||
| 4b8c90d47a | |||
| 21b5b71da6 | |||
| 159aa2a963 | |||
| afd84ddc60 | |||
| ac5ee8c94d | |||
| 1dd1aab12e | |||
| 8461092bcd | |||
| f050abb9f1 | |||
| 5248901265 | |||
| 4ad26eac7d | |||
| 9e06dca287 | |||
| 18ee6daf8a | |||
| 459eb426c3 | |||
| a0d670d2bf | |||
| d7b41212c1 | |||
| 2e1539eba4 | |||
| ee9521d87c | |||
| 8d8fc08bac | |||
| e79d304c79 | |||
| db03f03fd9 | |||
| 957403ebec | |||
| 6c32e1aaeb | |||
| 362e335c0b | |||
| ed6c49f874 | |||
| 47fcec5405 | |||
| d7239a45b6 | |||
| f13fb18c58 | |||
| d29644418d | |||
| ed9e426b26 | |||
| 659febf9ff | |||
| fca1fccfad | |||
| f713d63bab | |||
| 5a45e466cf | |||
| 742b24eb23 | |||
| 03369d2383 | |||
| 2605d662e0 | |||
| e8394ab5b5 | |||
| 8ad156a5c2 | |||
| f2d6fb6239 | |||
| e3a592c38d | |||
| 7e99819dda | |||
| a160d7f98d | |||
| 36cab842e8 | |||
| 7b7b86e327 | |||
| f4bfe638b6 | |||
| 0e9d242f05 | |||
| e24467a8c2 | |||
| b39c370a76 | |||
| 62e4e7cde2 | |||
| f822179f97 | |||
| 47e7e1e548 | |||
| e73b75314b | |||
| 8193a55b4a | |||
| 6036708fa2 | |||
| 4717aa0b6d | |||
| 97ae25ea7d | |||
| 6470ed033b | |||
| b550f9c1d5 | |||
| ee0273ffc3 | |||
| 50fce74b00 | |||
| e29f71d1c9 | |||
| 427ed20801 | |||
| d23e6c285b | |||
| 2c139b45d8 | |||
| 762435e3b7 | |||
| 6383d6b056 | |||
| 3712441ea6 | |||
| 9d0bc882fa | |||
| 90dddf3d3d | |||
| 86abd54d02 | |||
| 4ab5ad5425 | |||
| f9c1b758c3 | |||
| 38cf1bd5ba | |||
| aeda455930 | |||
| 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 |
@@ -1,8 +0,0 @@
|
||||
.build*.log
|
||||
*.rpm
|
||||
i686
|
||||
x86_64
|
||||
libvirt-*.tar.gz
|
||||
libvirt-0.6.0.tar.gz
|
||||
libvirt-0.6.1.tar.gz
|
||||
libvirt-0.6.2.tar.gz
|
||||
@@ -0,0 +1,8 @@
|
||||
.build*.log
|
||||
*.rpm
|
||||
i686
|
||||
x86_64
|
||||
libvirt-*.tar.gz
|
||||
/libvirt-0.8.4.tar.gz
|
||||
/libvirt-0.8.5.tar.gz
|
||||
/libvirt-0.8.7.tar.gz
|
||||
@@ -4,7 +4,7 @@ NAME := libvirt
|
||||
SPECFILE = $(firstword $(wildcard *.spec))
|
||||
|
||||
define find-makefile-common
|
||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(find-makefile-common))
|
||||
|
||||
@@ -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,24 +0,0 @@
|
||||
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 !
|
||||
@@ -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,47 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -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,130 +0,0 @@
|
||||
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;
|
||||
@@ -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,37 +0,0 @@
|
||||
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:
|
||||
@@ -1,125 +0,0 @@
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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,52 +0,0 @@
|
||||
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)
|
||||
@@ -1,22 +0,0 @@
|
||||
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') {
|
||||
@@ -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,160 +0,0 @@
|
||||
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)
|
||||
@@ -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 */
|
||||
@@ -0,0 +1,184 @@
|
||||
From a9311c363defcba7479fdabfb4862bcf851a6b7c Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Tue, 8 May 2012 20:42:44 +0300
|
||||
Subject: [PATCH] domain_conf: add "default" to list of valid spice channels
|
||||
|
||||
qemu's behavior in this case is to change the spice server behavior to
|
||||
require secure connection to any channel not otherwise specified as
|
||||
being in plaintext mode. libvirt doesn't currently allow requesting this
|
||||
(via plaintext-channel=<channel name>).
|
||||
|
||||
RHBZ: 819499
|
||||
|
||||
Signed-off-by: Alon Levy <alevy@redhat.com>
|
||||
(cherry picked from commit ba97e4edc6aa439a4f1e70855cf4503181efdb7f)
|
||||
|
||||
Conflicts:
|
||||
|
||||
src/conf/domain_conf.c
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
docs/formatdomain.html.in | 7 +++++++
|
||||
docs/schemas/domaincommon.rng | 9 +++++++++
|
||||
src/conf/domain_conf.c | 20 ++++++++++++++++++++
|
||||
src/conf/domain_conf.h | 1 +
|
||||
src/qemu/qemu_command.c | 13 +++++++++++++
|
||||
.../qemuxml2argv-graphics-spice.args | 2 +-
|
||||
.../qemuxml2argv-graphics-spice.xml | 2 +-
|
||||
7 files changed, 52 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
|
||||
index d082697..db5fa9b 100644
|
||||
--- a/docs/formatdomain.html.in
|
||||
+++ b/docs/formatdomain.html.in
|
||||
@@ -2308,6 +2308,13 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<span class="since">Since 0.9.3</span>
|
||||
NB, this may not be supported by all hypervisors.
|
||||
<span class="since">"spice" since 0.8.6</span>.
|
||||
+ The <code>defaultMode</code> attribute sets the default channel
|
||||
+ security policy, valid values are <code>secure</code>,
|
||||
+ <code>insecure</code> and the default <code>any</code>
|
||||
+ (which is secure if possible, but falls back to insecure
|
||||
+ rather than erroring out if no secure path is
|
||||
+ available). <span class="since">"defaultMode" since
|
||||
+ 0.9.12</span>.
|
||||
</p>
|
||||
<p>
|
||||
When SPICE has both a normal and TLS secured TCP port
|
||||
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||
index fe81c26..0d6edc8 100644
|
||||
--- a/docs/schemas/domaincommon.rng
|
||||
+++ b/docs/schemas/domaincommon.rng
|
||||
@@ -1388,6 +1388,15 @@
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
+ <optional>
|
||||
+ <attribute name="defaultMode">
|
||||
+ <choice>
|
||||
+ <value>any</value>
|
||||
+ <value>secure</value>
|
||||
+ <value>insecure</value>
|
||||
+ </choice>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
<interleave>
|
||||
<ref name="listenElements"/>
|
||||
<zeroOrMore>
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 9cc1644..963768e 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -4689,6 +4689,8 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
|
||||
char *port = virXMLPropString(node, "port");
|
||||
char *tlsPort;
|
||||
char *autoport;
|
||||
+ char *defaultMode;
|
||||
+ int defaultModeVal;
|
||||
|
||||
if (port) {
|
||||
if (virStrToLong_i(port, NULL, 10, &def->data.spice.port) < 0) {
|
||||
@@ -4726,6 +4728,20 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
|
||||
VIR_FREE(autoport);
|
||||
}
|
||||
|
||||
+ def->data.spice.defaultMode = VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY;
|
||||
+
|
||||
+ if ((defaultMode = virXMLPropString(node, "defaultMode")) != NULL) {
|
||||
+ if ((defaultModeVal = virDomainGraphicsSpiceChannelModeTypeFromString(defaultMode)) < 0) {
|
||||
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
+ _("unknown default spice channel mode %s"),
|
||||
+ defaultMode);
|
||||
+ VIR_FREE(defaultMode);
|
||||
+ goto error;
|
||||
+ }
|
||||
+ def->data.spice.defaultMode = defaultModeVal;
|
||||
+ VIR_FREE(defaultMode);
|
||||
+ }
|
||||
+
|
||||
def->data.spice.keymap = virXMLPropString(node, "keymap");
|
||||
|
||||
if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth,
|
||||
@@ -10311,6 +10327,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
|
||||
virBufferEscapeString(buf, " keymap='%s'",
|
||||
def->data.spice.keymap);
|
||||
|
||||
+ if (def->data.spice.defaultMode != VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY)
|
||||
+ virBufferAsprintf(buf, " defaultMode='%s'",
|
||||
+ virDomainGraphicsSpiceChannelModeTypeToString(def->data.spice.defaultMode));
|
||||
+
|
||||
virDomainGraphicsAuthDefFormatAttr(buf, &def->data.spice.auth, flags);
|
||||
break;
|
||||
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index d40fda6..f6df0ea 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -921,6 +921,7 @@ struct _virDomainGraphicsDef {
|
||||
virDomainGraphicsAuthDef auth;
|
||||
unsigned int autoport :1;
|
||||
int channels[VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST];
|
||||
+ int defaultMode; /* enum virDomainGraphicsSpiceChannelMode */
|
||||
int image;
|
||||
int jpeg;
|
||||
int zlib;
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 366913b..ee192d3 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -4720,6 +4720,7 @@ qemuBuildCommandLine(virConnectPtr conn,
|
||||
const char *listenAddr = NULL;
|
||||
char *netAddr = NULL;
|
||||
int ret;
|
||||
+ int defaultMode = def->graphics[0]->data.spice.defaultMode;
|
||||
|
||||
if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SPICE)) {
|
||||
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
@@ -4781,6 +4782,18 @@ qemuBuildCommandLine(virConnectPtr conn,
|
||||
virBufferAsprintf(&opt, ",x509-dir=%s",
|
||||
driver->spiceTLSx509certdir);
|
||||
|
||||
+ switch (defaultMode) {
|
||||
+ case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
|
||||
+ virBufferAsprintf(&opt, ",tls-channel=default");
|
||||
+ break;
|
||||
+ case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
|
||||
+ virBufferAsprintf(&opt, ",plaintext-channel=default");
|
||||
+ break;
|
||||
+ case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY:
|
||||
+ /* nothing */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
for (i = 0 ; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST ; i++) {
|
||||
int mode = def->graphics[0]->data.spice.channels[i];
|
||||
switch (mode) {
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
|
||||
index c9fdb99..698e39c 100644
|
||||
--- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
|
||||
@@ -2,7 +2,7 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
|
||||
/usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefaults -monitor \
|
||||
unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
|
||||
/dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\
|
||||
-x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\
|
||||
+x509-dir=/etc/pki/libvirt-spice,tls-channel=default,tls-channel=main,plaintext-channel=inputs,\
|
||||
image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
|
||||
playback-compression=on,streaming-video=filter,disable-copy-paste -vga \
|
||||
qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
|
||||
index 5313b3a..29f20ab 100644
|
||||
--- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
|
||||
@@ -21,7 +21,7 @@
|
||||
</disk>
|
||||
<controller type='ide' index='0'/>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
- <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
|
||||
+ <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' defaultMode='secure'>
|
||||
<listen type='address' address='127.0.0.1'/>
|
||||
<channel name='main' mode='secure'/>
|
||||
<channel name='inputs' mode='insecure'/>
|
||||
--
|
||||
1.7.7.6
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
From b8c86d80df4ba6c682f05974892f5d7ab8f317a9 Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Tue, 8 May 2012 16:00:28 +0300
|
||||
Subject: [PATCH] domain_conf: add "usbredir" to list of valid spice channels
|
||||
|
||||
Add "usbredir" channel to list of recognized spice channels.
|
||||
|
||||
RHBZ: 819498
|
||||
|
||||
Signed-off-by: Alon Levy <alevy@redhat.com>
|
||||
(cherry picked from commit 4e78ffb63489071c4100678ed88d3111284555e8)
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
docs/formatdomain.html.in | 8 ++-
|
||||
docs/schemas/domaincommon.rng | 1 +
|
||||
src/conf/domain_conf.c | 3 +-
|
||||
src/conf/domain_conf.h | 1 +
|
||||
.../qemuxml2argv-graphics-spice-usb-redir.args | 16 ++++++
|
||||
.../qemuxml2argv-graphics-spice-usb-redir.xml | 53 ++++++++++++++++++++
|
||||
tests/qemuxml2argvtest.c | 6 ++
|
||||
7 files changed, 84 insertions(+), 4 deletions(-)
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.args
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml
|
||||
|
||||
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
|
||||
index 390476d..d082697 100644
|
||||
--- a/docs/formatdomain.html.in
|
||||
+++ b/docs/formatdomain.html.in
|
||||
@@ -2317,9 +2317,11 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
main <graphics> element. Valid channel names
|
||||
include <code>main</code>, <code>display</code>,
|
||||
<code>inputs</code>, <code>cursor</code>,
|
||||
- <code>playback</code>, <code>record</code>;
|
||||
- and <span class="since">since
|
||||
- 0.8.8</span>: <code>smartcard</code>.
|
||||
+ <code>playback</code>, <code>record</code>
|
||||
+ (all <span class="since"> since 0.8.6</span>);
|
||||
+ <code>smartcard</code> (<span class="since">since
|
||||
+ 0.8.8</span>); and <code>usbredir</code>
|
||||
+ (<span class="since">since 0.9.12</span>).
|
||||
</p>
|
||||
<pre>
|
||||
<graphics type='spice' port='-1' tlsPort='-1' autoport='yes'>
|
||||
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||
index 9f8d292..fe81c26 100644
|
||||
--- a/docs/schemas/domaincommon.rng
|
||||
+++ b/docs/schemas/domaincommon.rng
|
||||
@@ -1401,6 +1401,7 @@
|
||||
<value>playback</value>
|
||||
<value>record</value>
|
||||
<value>smartcard</value>
|
||||
+ <value>usbredir</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name="mode">
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 2f9da71..9cc1644 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -389,7 +389,8 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelName,
|
||||
"cursor",
|
||||
"playback",
|
||||
"record",
|
||||
- "smartcard");
|
||||
+ "smartcard",
|
||||
+ "usbredir");
|
||||
|
||||
VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelMode,
|
||||
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_LAST,
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index f2cd8eb..d40fda6 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -797,6 +797,7 @@ enum virDomainGraphicsSpiceChannelName {
|
||||
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_PLAYBACK,
|
||||
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_RECORD,
|
||||
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_SMARTCARD,
|
||||
+ VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_USBREDIR,
|
||||
|
||||
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST
|
||||
};
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.args
|
||||
new file mode 100644
|
||||
index 0000000..35e51a7
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.args
|
||||
@@ -0,0 +1,16 @@
|
||||
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice /usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
|
||||
+-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
|
||||
+-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
|
||||
+-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
|
||||
+-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
|
||||
+-spice port=5903,tls-port=5904,addr=127.0.0.1,\
|
||||
+x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\
|
||||
+tls-channel=usbredir,\
|
||||
+image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
|
||||
+playback-compression=on,streaming-video=filter,disable-copy-paste \
|
||||
+-vga cirrus \
|
||||
+-chardev socket,id=charredir0,host=localhost,port=4000 \
|
||||
+-device usb-redir,chardev=charredir0,id=redir0 \
|
||||
+-chardev spicevmc,id=charredir1,name=usbredir \
|
||||
+-device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=4 \
|
||||
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml
|
||||
new file mode 100644
|
||||
index 0000000..1dc23bd
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml
|
||||
@@ -0,0 +1,53 @@
|
||||
+<domain type='qemu'>
|
||||
+ <name>QEMUGuest1</name>
|
||||
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
+ <memory unit='KiB'>219136</memory>
|
||||
+ <currentMemory unit='KiB'>219136</currentMemory>
|
||||
+ <vcpu>1</vcpu>
|
||||
+ <os>
|
||||
+ <type arch='i686' machine='pc'>hvm</type>
|
||||
+ <boot dev='hd'/>
|
||||
+ </os>
|
||||
+ <clock offset='utc'/>
|
||||
+ <on_poweroff>destroy</on_poweroff>
|
||||
+ <on_reboot>restart</on_reboot>
|
||||
+ <on_crash>destroy</on_crash>
|
||||
+ <devices>
|
||||
+ <emulator>/usr/bin/qemu</emulator>
|
||||
+ <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
|
||||
+ <listen type='address' address='127.0.0.1'/>
|
||||
+ <channel name='main' mode='secure'/>
|
||||
+ <channel name='inputs' mode='insecure'/>
|
||||
+ <channel name='usbredir' mode='secure'/>
|
||||
+ <image compression='auto_glz'/>
|
||||
+ <jpeg compression='auto'/>
|
||||
+ <zlib compression='auto'/>
|
||||
+ <playback compression='on'/>
|
||||
+ <streaming mode='filter'/>
|
||||
+ <clipboard copypaste='no'/>
|
||||
+ </graphics>
|
||||
+ <controller type='usb' index='0' model='ich9-ehci1'>
|
||||
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
|
||||
+ </controller>
|
||||
+ <controller type='usb' index='0' model='ich9-uhci1'>
|
||||
+ <master startport='0'/>
|
||||
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
|
||||
+ </controller>
|
||||
+ <controller type='usb' index='0' model='ich9-uhci2'>
|
||||
+ <master startport='2'/>
|
||||
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
|
||||
+ </controller>
|
||||
+ <controller type='usb' index='0' model='ich9-uhci3'>
|
||||
+ <master startport='4'/>
|
||||
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
|
||||
+ </controller>
|
||||
+ <redirdev bus='usb' type='tcp'>
|
||||
+ <source mode='connect' host='localhost' service='4000'/>
|
||||
+ <protocol type='raw'/>
|
||||
+ </redirdev>
|
||||
+ <redirdev bus='usb' type='spicevmc'>
|
||||
+ <address type='usb' bus='0' port='4'/>
|
||||
+ </redirdev>
|
||||
+ <memballoon model='virtio'/>
|
||||
+ </devices>
|
||||
+</domain>
|
||||
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
||||
index 1dc6a01..d5475c5 100644
|
||||
--- a/tests/qemuxml2argvtest.c
|
||||
+++ b/tests/qemuxml2argvtest.c
|
||||
@@ -405,6 +405,12 @@ mymain(void)
|
||||
QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
|
||||
QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
|
||||
QEMU_CAPS_DEVICE_QXL_VGA);
|
||||
+ DO_TEST("graphics-spice-usb-redir", false,
|
||||
+ QEMU_CAPS_VGA, QEMU_CAPS_SPICE,
|
||||
+ QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
||||
+ QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB,
|
||||
+ QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR,
|
||||
+ QEMU_CAPS_CHARDEV_SPICEVMC);
|
||||
|
||||
DO_TEST("input-usbmouse", false, NONE);
|
||||
DO_TEST("input-usbtablet", false, NONE);
|
||||
--
|
||||
1.7.7.6
|
||||
|
||||
diff -rup libvirt-0.9.6.1/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml foo/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml
|
||||
--- libvirt-0.9.6.1/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml 2012-06-15 17:10:09.086979189 -0400
|
||||
+++ foo/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-usb-redir.xml 2012-06-15 17:21:08.788770706 -0400
|
||||
@@ -1,8 +1,8 @@
|
||||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
- <memory unit='KiB'>219136</memory>
|
||||
- <currentMemory unit='KiB'>219136</currentMemory>
|
||||
+ <memory>219136</memory>
|
||||
+ <currentMemory>219136</currentMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
@@ -0,0 +1,136 @@
|
||||
From 57f08fb47b0938a9e8969b857380926fa6966ca8 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@laine.org>
|
||||
Date: Wed, 14 Mar 2012 01:41:35 -0400
|
||||
Subject: [PATCH] Emit graphics events when a SPICE client
|
||||
connects/disconnects
|
||||
|
||||
Wire up the domain graphics event notifications for SPICE. Adapted
|
||||
from a RHEL-only patch written by Dan Berrange that used custom
|
||||
__com.redhat_SPICE events - equivalent events are now available in
|
||||
upstream QEMU (including a SPICE_CONNECTED event, which was missing in
|
||||
the __COM.redhat_SPICE version).
|
||||
|
||||
* src/qemu/qemu_monitor_json.c: Wire up SPICE graphics events
|
||||
(cherry picked from commit 89ae6a5a30bd91cfb2365544f9dd2e6c2a36ecca)
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_monitor_json.c | 56 +++++++++++++++++++++++++++++++++++++++---
|
||||
1 files changed, 52 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
||||
index e38c2ed..d4a3b7b 100644
|
||||
--- a/src/qemu/qemu_monitor_json.c
|
||||
+++ b/src/qemu/qemu_monitor_json.c
|
||||
@@ -57,6 +57,9 @@ static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr
|
||||
static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
+static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
+static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
+static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
||||
|
||||
struct {
|
||||
const char *type;
|
||||
@@ -73,6 +76,9 @@ struct {
|
||||
{ "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, },
|
||||
{ "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, },
|
||||
{ "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, },
|
||||
+ { "SPICE_CONNECTED", qemuMonitorJSONHandleSPICEConnect, },
|
||||
+ { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, },
|
||||
+ { "SPICE_DISCONNECTED", qemuMonitorJSONHandleSPICEDisconnect, },
|
||||
};
|
||||
|
||||
|
||||
@@ -617,7 +623,7 @@ VIR_ENUM_DECL(qemuMonitorGraphicsAddressFamily)
|
||||
VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily, VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV6 + 1,
|
||||
"ipv4", "ipv6");
|
||||
|
||||
-static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, int phase)
|
||||
+static void qemuMonitorJSONHandleGraphics(qemuMonitorPtr mon, virJSONValuePtr data, int phase)
|
||||
{
|
||||
const char *localNode, *localService, *localFamily;
|
||||
const char *remoteNode, *remoteService, *remoteFamily;
|
||||
@@ -636,14 +642,38 @@ static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i
|
||||
}
|
||||
|
||||
authScheme = virJSONValueObjectGetString(server, "auth");
|
||||
+ if (!authScheme) {
|
||||
+ VIR_WARN("missing auth scheme in graphics event");
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
localFamily = virJSONValueObjectGetString(server, "family");
|
||||
+ if (!localFamily) {
|
||||
+ VIR_WARN("missing local address family in graphics event");
|
||||
+ return;
|
||||
+ }
|
||||
localNode = virJSONValueObjectGetString(server, "host");
|
||||
+ if (!localNode) {
|
||||
+ VIR_WARN("missing local hostname in graphics event");
|
||||
+ return;
|
||||
+ }
|
||||
localService = virJSONValueObjectGetString(server, "service");
|
||||
+ if (!localService)
|
||||
+ localService = ""; /* Spice has multiple ports, so this isn't provided */
|
||||
|
||||
remoteFamily = virJSONValueObjectGetString(client, "family");
|
||||
+ if (!remoteFamily) {
|
||||
+ VIR_WARN("missing remote address family in graphics event");
|
||||
+ return;
|
||||
+ }
|
||||
remoteNode = virJSONValueObjectGetString(client, "host");
|
||||
+ if (!remoteNode) {
|
||||
+ VIR_WARN("missing remote hostname in graphics event");
|
||||
+ return;
|
||||
+ }
|
||||
remoteService = virJSONValueObjectGetString(client, "service");
|
||||
+ if (!remoteService)
|
||||
+ remoteService = ""; /* Spice has multiple ports, so this isn't provided */
|
||||
|
||||
saslUsername = virJSONValueObjectGetString(client, "sasl_username");
|
||||
x509dname = virJSONValueObjectGetString(client, "x509_dname");
|
||||
@@ -665,19 +695,37 @@ static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i
|
||||
|
||||
static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
{
|
||||
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
||||
}
|
||||
|
||||
|
||||
static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
{
|
||||
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
||||
}
|
||||
|
||||
|
||||
static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
{
|
||||
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
+{
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
+{
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
+{
|
||||
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
||||
}
|
||||
|
||||
static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data)
|
||||
--
|
||||
1.7.7.6
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
From eaf056bf995558ecf6620ce031287f3aa81b66de Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@laine.org>
|
||||
Date: Tue, 6 Dec 2011 12:47:28 -0500
|
||||
Subject: [PATCH 1/2] qemu: replace deprecated fedora-13 machine type with
|
||||
pc-0.14
|
||||
|
||||
This addresses https://bugzilla.redhat.com/show_bug.cgi?id=754772 .
|
||||
It should only be applied to Fedora builds of libvirt, F15 and
|
||||
later, so there is no upstream equivalent patch.
|
||||
|
||||
Background:
|
||||
|
||||
During the lifetime of Fedora 13, some features were backported into
|
||||
the F13 build of qemu-kvm from upstream. These features were part of
|
||||
the functionality of machine type "pc-0.13" in upstream qemu-kvm, so a
|
||||
special "fedora-13" machine type was created for the F13 qemu-kvm.
|
||||
Since "fedora-13" became the new "canonical machine type", all new
|
||||
domains created with F13 libvirt tools by default contained that
|
||||
machine type in their configuration file.
|
||||
|
||||
In Fedora 14, a patch was made to qemu to treat the fedora-13 machine
|
||||
type as equivalent to "pc-0.13". When Fedora 15 was released, this was
|
||||
inadvertently changed to make it equivalent to "pc-0.14".
|
||||
|
||||
With the release of Fedora 16, qemu-kvm initially removed support for
|
||||
this machine type, which caused failure of many guest configurations
|
||||
to start. qemu-kvm subsequently re-added the patch to support
|
||||
fedora-13 (as equivalent to pc-0.14), but with the promise that they
|
||||
could remove it with the release of Fedora 17. (see
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=748218 ).
|
||||
|
||||
Solution:
|
||||
|
||||
In order to create a repeat of the recent problems, prior to F17
|
||||
existing guest configurations need to be updated to change fedora-13
|
||||
to pc-0.14 (which has been determined to be equivalent for all
|
||||
practical purposes in both F15 and F16). That's what this patch does:
|
||||
|
||||
1) Each time libvirtd is started, it calls virDomainLoadAllConfigs()
|
||||
which calls virDomainLoadConfig(); this function has been modified to
|
||||
check for os.machine == "fedora-13", and change it to "pc-0.14" then
|
||||
write the updated config back to disk.
|
||||
|
||||
2) Also, any other time a domain definition is parsed, the parsed
|
||||
version in memory is changed to turn "fedora-13" into "pc-0.14". This
|
||||
handles domains that had been saved to disk prior to the upgrade, and
|
||||
are subsequently restarted.
|
||||
|
||||
3) Finally, whenever a domain definition is formatted into a string,
|
||||
any occurrence of fedora-13 is replaced with pc-0.14 *directly in the
|
||||
virDomainDef* (to avoid multiple warning messages for the same object
|
||||
when it's formatted multiple times). This should deal with those cases
|
||||
where a domain was running at the time of upgrade, and is later
|
||||
saved/snapshotted.
|
||||
|
||||
I had considered doing this with some sed commands in the specfile,
|
||||
but that wouldn't do anything to help the xml saved in image files.
|
||||
|
||||
(Also, one of the xml tests was using the machine type "fedora-13",
|
||||
and since that machine type is treated specially by the rest of this
|
||||
patch, it was failing. That has been changed in a separate patch,
|
||||
which must be applied with this patch, and which *is* also upstream).
|
||||
---
|
||||
src/conf/domain_conf.c | 62 +++++++++++++++++++++++++++++++++++++++++++++--
|
||||
1 files changed, 59 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 318f523..7906bb8 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -7500,7 +7500,25 @@ virDomainDefPtr virDomainDefParseString(virCapsPtr caps,
|
||||
unsigned int expectedVirtTypes,
|
||||
unsigned int flags)
|
||||
{
|
||||
- return virDomainDefParse(xmlStr, NULL, caps, expectedVirtTypes, flags);
|
||||
+ virDomainDefPtr def
|
||||
+ = virDomainDefParse(xmlStr, NULL, caps, expectedVirtTypes, flags);
|
||||
+
|
||||
+ /* Fedora-specific HACK - treat fedora-13 and pc-0.14 as equivalent.
|
||||
+ * This handles the case of domains that had been saved to an image file
|
||||
+ * prior to upgrade (save or snapshot), then restarted/reverted.
|
||||
+ */
|
||||
+ if (def && STREQ_NULLABLE(def->os.machine, "fedora-13")) {
|
||||
+ VIR_FREE(def->os.machine);
|
||||
+ if (!(def->os.machine = strdup("pc-0.14"))) {
|
||||
+ virReportOOMError();
|
||||
+ virDomainDefFree(def);
|
||||
+ def = NULL;
|
||||
+ } else {
|
||||
+ VIR_WARN("Replacing deprecated 'fedora-13' machine type "
|
||||
+ "with equivalent 'pc-0.14' in domain %s xml", def->name);
|
||||
+ }
|
||||
+ }
|
||||
+ return def;
|
||||
}
|
||||
|
||||
virDomainDefPtr virDomainDefParseFile(virCapsPtr caps,
|
||||
@@ -10648,8 +10666,30 @@ virDomainDefFormatInternal(virDomainDefPtr def,
|
||||
virBufferAddLit(buf, " <type");
|
||||
if (def->os.arch)
|
||||
virBufferAsprintf(buf, " arch='%s'", def->os.arch);
|
||||
- if (def->os.machine)
|
||||
- virBufferAsprintf(buf, " machine='%s'", def->os.machine);
|
||||
+ if (def->os.machine) {
|
||||
+ /* Fedora-specific HACK - replace "fedora-13" with "pc-0.14"
|
||||
+ * (in the original DomainDef as well as in the xml output).
|
||||
+ * This will catch XML being written to save/migration images
|
||||
+ * of domains that were running when libvirtd was restarted at
|
||||
+ * the time of upgrade.
|
||||
+ */
|
||||
+ if (STREQ_NULLABLE(def->os.machine, "fedora-13")) {
|
||||
+ virBufferAddLit(buf, " machine='pc-0.14'");
|
||||
+ VIR_WARN("substituting machine type 'fedora-13' with 'pc-0.14' "
|
||||
+ "in domain %s", def->name);
|
||||
+ /* It's not exactly nice to modify the source object,
|
||||
+ * but sometimes virDomainFormat is called > 100 times for the
|
||||
+ * same object, which would result in far too many warning logs.
|
||||
+ */
|
||||
+ VIR_FREE(def->os.machine);
|
||||
+ if (!(def->os.machine = strdup("pc-0.14"))) {
|
||||
+ virReportOOMError();
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ } else {
|
||||
+ virBufferAsprintf(buf, " machine='%s'", def->os.machine);
|
||||
+ }
|
||||
+ }
|
||||
/*
|
||||
* HACK: For xen driver we previously used bogus 'linux' as the
|
||||
* os type for paravirt, whereas capabilities declare it to
|
||||
@@ -11100,6 +11140,22 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps,
|
||||
VIR_DOMAIN_XML_INACTIVE)))
|
||||
goto error;
|
||||
|
||||
+ /* Fedora-specific HACK - replace "fedora-13" with "pc-0.14".
|
||||
+ * This updates all config files at the first restart of libvirt
|
||||
+ * after upgrade.
|
||||
+ */
|
||||
+ if (STREQ_NULLABLE(def->os.machine, "fedora-13")) {
|
||||
+ VIR_FREE(def->os.machine);
|
||||
+ if (!(def->os.machine = strdup("pc-0.14"))) {
|
||||
+ virReportOOMError();
|
||||
+ goto error;
|
||||
+ }
|
||||
+ VIR_WARN("Replacing deprecated 'fedora-13' machine type "
|
||||
+ "with equivalent 'pc-0.14' in domain %s configuration file", name);
|
||||
+ if (virDomainSaveConfig(configDir, def) < 0)
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
if ((autostartLink = virDomainConfigFile(autostartDir, name)) == NULL)
|
||||
goto error;
|
||||
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+1246
-451
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user