Compare commits
81 Commits
F-8-split
...
libvirt-0_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
529d097d28 | ||
|
|
3eb78ffd37 | ||
|
|
8841355697 | ||
|
|
40a867daeb | ||
|
|
60e1b2cda5 | ||
|
|
c8361aee7d | ||
|
|
bda88aaa38 | ||
|
|
ca4d795c85 | ||
|
|
e2e196d813 | ||
|
|
a5a2a38a5e | ||
|
|
30f098460c | ||
|
|
7017c99a1e | ||
|
|
1c41ce6f30 | ||
|
|
c6db79d97f | ||
|
|
7b7f8cc27f | ||
|
|
a9cc41b082 | ||
|
|
ce1593f88f | ||
|
|
f5edf79c95 | ||
|
|
b59e64bf44 | ||
|
|
a09fc2658a | ||
|
|
a008fcf27e | ||
|
|
511f6cd625 | ||
|
|
48b90fefc1 | ||
|
|
bc4bbabdf6 | ||
|
|
905627c8fd | ||
|
|
a16d752c10 | ||
|
|
29b1292019 | ||
|
|
f3546be64b | ||
|
|
fb9044931e | ||
|
|
03c5fec4d2 | ||
|
|
ce373a25b6 | ||
|
|
996d0e4709 | ||
|
|
8c01426c44 | ||
|
|
e859f7e59e | ||
|
|
25ea2f59bd | ||
|
|
c80b7f0d5a | ||
|
|
958f1c3dff | ||
|
|
4a8ca1017f | ||
|
|
1e122ee5dc | ||
|
|
6a6307bcdc | ||
|
|
6e8332946a | ||
|
|
982683e56f | ||
|
|
7244d1a339 | ||
|
|
2a3935580c | ||
|
|
28f7f11450 | ||
|
|
ca07bc4597 | ||
|
|
8e23194a2b | ||
|
|
fe09090e2d | ||
|
|
b5868cf8cf | ||
|
|
f294b40ba5 | ||
|
|
c0c1a7bb79 | ||
|
|
1b864048bd | ||
|
|
072c9c45ab | ||
|
|
af111679c3 | ||
|
|
dd9f21eaa2 | ||
|
|
f0e356df98 | ||
|
|
140bcf9ffc | ||
|
|
af69660412 | ||
|
|
6dc94c6252 | ||
|
|
eb34165670 | ||
|
|
7ce08f2148 | ||
|
|
049a8c79d9 | ||
|
|
f7a6d90012 | ||
|
|
67a2f29a89 | ||
|
|
82422fa1ff | ||
|
|
a73cf1d010 | ||
|
|
481419ebb6 | ||
|
|
1e65165c3a | ||
|
|
bca27d9111 | ||
|
|
08b9144b41 | ||
|
|
2063007248 | ||
|
|
81e46cb6da | ||
|
|
263e2f2021 | ||
|
|
2b9efc3de2 | ||
|
|
69f6239766 | ||
|
|
bf744f9872 | ||
|
|
45b0b2bfa6 | ||
|
|
f29ea218b7 | ||
|
|
7d193b7810 | ||
|
|
3182a4df5a | ||
|
|
4f667910e9 |
32
.cvsignore
32
.cvsignore
@@ -1,24 +1,8 @@
|
|||||||
libvirt-0.0.3.tar.gz
|
.build*.log
|
||||||
libvirt-0.0.4.tar.gz
|
*.rpm
|
||||||
libvirt-0.0.5.tar.gz
|
i686
|
||||||
libvirt-0.0.6.tar.gz
|
x86_64
|
||||||
libvirt-0.1.0.tar.gz
|
libvirt-*.tar.gz
|
||||||
libvirt-0.1.2.tar.gz
|
libvirt-0.6.0.tar.gz
|
||||||
libvirt-0.1.1.tar.gz
|
libvirt-0.6.1.tar.gz
|
||||||
libvirt-0.1.3.tar.gz
|
libvirt-0.6.2.tar.gz
|
||||||
libvirt-0.1.4.tar.gz
|
|
||||||
libvirt-0.1.5.tar.gz
|
|
||||||
libvirt-0.1.6.tar.gz
|
|
||||||
libvirt-0.1.7.tar.gz
|
|
||||||
libvirt-0.1.8.tar.gz
|
|
||||||
libvirt-0.1.9.tar.gz
|
|
||||||
libvirt-0.1.10.tar.gz
|
|
||||||
libvirt-0.1.11.tar.gz
|
|
||||||
libvirt-0.2.0.tar.gz
|
|
||||||
libvirt-0.2.1.tar.gz
|
|
||||||
libvirt-0.2.2.tar.gz
|
|
||||||
libvirt-0.2.3.tar.gz
|
|
||||||
libvirt-0.3.0.tar.gz
|
|
||||||
libvirt-0.3.1.tar.gz
|
|
||||||
libvirt-0.3.2.tar.gz
|
|
||||||
libvirt-0.3.3.tar.gz
|
|
||||||
|
|||||||
@@ -1,207 +0,0 @@
|
|||||||
changeset: 1147:7481eafdde8d
|
|
||||||
user: berrange
|
|
||||||
date: Fri Oct 12 18:54:15 2007 +0000
|
|
||||||
files: libvirt.spec.in qemud/Makefile.am qemud/libvirtd.conf src/Makefile.am src/qemu.conf
|
|
||||||
description:
|
|
||||||
Added default example configs for libvirtd/qemu driver
|
|
||||||
|
|
||||||
|
|
||||||
diff -r c48e81e685a3 -r 7481eafdde8d qemud/libvirtd.conf
|
|
||||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
|
||||||
+++ b/qemud/libvirtd.conf Fri Oct 12 18:54:15 2007 +0000
|
|
||||||
@@ -0,0 +1,141 @@
|
|
||||||
+# Master libvirt daemon configuration file
|
|
||||||
+#
|
|
||||||
+# For further information consult http://libvirt.org/format.html
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Flag listening for secure TLS connections on the public TCP/IP port.
|
|
||||||
+# NB, must pass the --listen flag to the libvirtd process for this to
|
|
||||||
+# have any effect.
|
|
||||||
+#
|
|
||||||
+# It is neccessary to setup a CA and issue server certificates before
|
|
||||||
+# using this capability.
|
|
||||||
+#
|
|
||||||
+# This is enabled by default, uncomment this to disable it
|
|
||||||
+# listen_tls = 0
|
|
||||||
+
|
|
||||||
+# Listen for unencrypted TCP connections on the public TCP/IP port.
|
|
||||||
+# NB, must pass the --listen flag to the libvirtd process for this to
|
|
||||||
+# have any effect.
|
|
||||||
+#
|
|
||||||
+# NB, this is insecure. Do not use except for development.
|
|
||||||
+#
|
|
||||||
+# This is disabled by default, uncomment this to enable it.
|
|
||||||
+# listen_tcp = 1
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Override the port for accepting secure TLS connections
|
|
||||||
+# This can be a port number, or service name
|
|
||||||
+#
|
|
||||||
+# tls_port = "16514"
|
|
||||||
+
|
|
||||||
+# Override the port for accepting insecure TCP connections
|
|
||||||
+# This can be a port number, or service name
|
|
||||||
+#
|
|
||||||
+# tcp_port = "16509"
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Flag toggling mDNS advertizement of the libvirt service.
|
|
||||||
+#
|
|
||||||
+# Alternatively can disable for all services on a host by
|
|
||||||
+# stopping the Avahi daemon
|
|
||||||
+#
|
|
||||||
+# This is enabled by default, uncomment this to disable it
|
|
||||||
+# mdns_adv = 0
|
|
||||||
+
|
|
||||||
+# Override the default mDNS advertizement name. This must be
|
|
||||||
+# unique on the immediate broadcast network.
|
|
||||||
+#
|
|
||||||
+# The default is "Virtualization Host HOSTNAME", where HOSTNAME
|
|
||||||
+# is subsituted for the short hostname of the machine (without domain)
|
|
||||||
+#
|
|
||||||
+# mdns_name "Virtualization Host Joe Demo"
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Set the UNIX domain socket group ownership. This can be used to
|
|
||||||
+# allow a 'trusted' set of users access to management capabilities
|
|
||||||
+# without becoming root.
|
|
||||||
+#
|
|
||||||
+# This is restricted to 'root' by default.
|
|
||||||
+# unix_sock_group "libvirt"
|
|
||||||
+
|
|
||||||
+# Set the UNIX socket permissions for the R/O socket. This is used
|
|
||||||
+# for monitoring VM status only
|
|
||||||
+#
|
|
||||||
+# Default allows any user. If setting group ownership may want to
|
|
||||||
+# restrict this to:
|
|
||||||
+# unix_sock_ro_perms "0777"
|
|
||||||
+
|
|
||||||
+# Set the UNIX socket permissions for the R/W socket. This is used
|
|
||||||
+# for full management of VMs
|
|
||||||
+#
|
|
||||||
+# Default allows only root. If setting group ownership may want to
|
|
||||||
+# relax this to:
|
|
||||||
+# unix_sock_rw_perms "octal-perms" "0770"
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Flag to disable verification of client certificates
|
|
||||||
+#
|
|
||||||
+# Client certificate verification is the primary authentication mechanism.
|
|
||||||
+# Any client which does not present a certificate signed by the CA
|
|
||||||
+# will be rejected.
|
|
||||||
+#
|
|
||||||
+# Default is to always verify. Uncommenting this will disable
|
|
||||||
+# verification - make sure an IP whitelist is set
|
|
||||||
+# tls_no_verify_certificate 1
|
|
||||||
+
|
|
||||||
+# Flag to disable verification of client IP address
|
|
||||||
+#
|
|
||||||
+# Client IP address will be verified against the CommonName field
|
|
||||||
+# of the x509 certificate. This has minimal security benefit since
|
|
||||||
+# it is easy to spoof source IP.
|
|
||||||
+#
|
|
||||||
+# Uncommenting this will disable verification
|
|
||||||
+# tls_no_verify_address 1
|
|
||||||
+
|
|
||||||
+# Override the default server key file path
|
|
||||||
+#
|
|
||||||
+# key_file "/etc/pki/libvirt/private/serverkey.pem"
|
|
||||||
+
|
|
||||||
+# Override the default server certificate file path
|
|
||||||
+#
|
|
||||||
+# cert_file "/etc/pki/libvirt/servercert.pem"
|
|
||||||
+
|
|
||||||
+# Override the default CA certificate path
|
|
||||||
+#
|
|
||||||
+# ca_file "/etc/pki/CA/cacert.pem"
|
|
||||||
+
|
|
||||||
+# Specify a certificate revocation list.
|
|
||||||
+#
|
|
||||||
+# Defaults to not using a CRL, uncomment to enable it
|
|
||||||
+# crl_file "/etc/pki/CA/crl.pem"
|
|
||||||
+
|
|
||||||
+# A whitelist of allowed x509 Distinguished Names
|
|
||||||
+# This list may contain wildcards such as
|
|
||||||
+#
|
|
||||||
+# "C=GB,ST=London,L=London,O=Red Hat,CN=*"
|
|
||||||
+#
|
|
||||||
+# See the POSIX fnmatch function for the format of the wildcards.
|
|
||||||
+#
|
|
||||||
+# NB If this is an empty list, no client can connect, so comment out
|
|
||||||
+# entirely rather than using empty list to disable these checks
|
|
||||||
+#
|
|
||||||
+# By default, no DN's are checked
|
|
||||||
+# tls_allowed_dn_list ["DN1", "DN2"]
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# A whitelist of allowed client IP addresses
|
|
||||||
+#
|
|
||||||
+# This list may contain wildcards such as 192.168.* See the POSIX fnmatch
|
|
||||||
+# function for the format of the wildcards.
|
|
||||||
+#
|
|
||||||
+# NB If this is an empty list, no client can connect, so comment out
|
|
||||||
+# entirely rather than using empty list to disable these checks
|
|
||||||
+#
|
|
||||||
+# By default, no IP's are checked. This can be IPv4 or IPv6 addresses
|
|
||||||
+# tls_allowed_ip_list ["ip1", "ip2", "ip3"]
|
|
||||||
+
|
|
||||||
+
|
|
||||||
diff -r c48e81e685a3 -r 7481eafdde8d src/qemu.conf
|
|
||||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
|
||||||
+++ b/src/qemu.conf Fri Oct 12 18:54:15 2007 +0000
|
|
||||||
@@ -0,0 +1,49 @@
|
|
||||||
+# Master configuration file for the QEMU driver.
|
|
||||||
+# All settings described here are optional - if omitted, sensible
|
|
||||||
+# defaults are used.
|
|
||||||
+
|
|
||||||
+# VNC is configured to listen on 127.0.0.1 by default.
|
|
||||||
+# To make it listen on all public interfaces, uncomment
|
|
||||||
+# this next option.
|
|
||||||
+#
|
|
||||||
+# NB, strong recommendation to enable TLS + x509 certificate
|
|
||||||
+# verification when allowing public access
|
|
||||||
+#
|
|
||||||
+# vnc_listen = "0.0.0.0"
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Enable use of TLS encryption on the VNC server. This requires
|
|
||||||
+# a VNC client which supports the VeNCrypt protocol extension.
|
|
||||||
+# Examples include vinagre, virt-viewer, virt-manager and vencrypt
|
|
||||||
+# itself. UltraVNC, RealVNC, TightVNC do not support this
|
|
||||||
+#
|
|
||||||
+# It is neccessary to setup CA and issue a server certificate
|
|
||||||
+# before enabling this.
|
|
||||||
+#
|
|
||||||
+# vnc_tls = 1
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Use of TLS requires that x509 certificates be issued. The
|
|
||||||
+# default it to keep them in /etc/pki/libvirt-vnc. This directory
|
|
||||||
+# must contain
|
|
||||||
+#
|
|
||||||
+# ca-cert.pem - the CA master certificate
|
|
||||||
+# server-cert.pem - the server certificate signed with ca-cert.pem
|
|
||||||
+# server-key.pem - the server private key
|
|
||||||
+#
|
|
||||||
+# This option allows the certificate directory to be changed
|
|
||||||
+#
|
|
||||||
+# vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc"
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# The default TLS configuration only uses certificates for the server
|
|
||||||
+# allowing the client to verify the server's identity and establish
|
|
||||||
+# and encrypted channel.
|
|
||||||
+#
|
|
||||||
+# It is possible to use x509 certificates for authentication too, by
|
|
||||||
+# issuing a x509 certificate to every client who needs to connect.
|
|
||||||
+#
|
|
||||||
+# Enabling this option will reject any client who does not have a
|
|
||||||
+# certificate signed by the CA in /etc/pki/libvirt-vnc/ca-cert.pem
|
|
||||||
+#
|
|
||||||
+# vnc_tls_x509_verify = 1
|
|
||||||
|
|
||||||
@@ -1,230 +0,0 @@
|
|||||||
changeset: 1146:c48e81e685a3
|
|
||||||
user: berrange
|
|
||||||
date: Fri Oct 12 15:05:44 2007 +0000
|
|
||||||
files: ChangeLog src/qemu_conf.c src/qemu_conf.h src/qemu_driver.c
|
|
||||||
description:
|
|
||||||
Added QEMU driver config file
|
|
||||||
|
|
||||||
|
|
||||||
diff -r 522efe7f7e8f -r c48e81e685a3 src/qemu_conf.c
|
|
||||||
--- a/src/qemu_conf.c Wed Oct 10 18:46:17 2007 +0000
|
|
||||||
+++ b/src/qemu_conf.c Fri Oct 12 15:05:44 2007 +0000
|
|
||||||
@@ -45,6 +45,7 @@
|
|
||||||
#include "qemu_conf.h"
|
|
||||||
#include "uuid.h"
|
|
||||||
#include "buf.h"
|
|
||||||
+#include "conf.h"
|
|
||||||
|
|
||||||
#define qemudLog(level, msg...) fprintf(stderr, msg)
|
|
||||||
|
|
||||||
@@ -65,6 +66,68 @@ void qemudReportError(virConnectPtr conn
|
|
||||||
__virRaiseError(conn, dom, net, VIR_FROM_QEMU, code, VIR_ERR_ERROR,
|
|
||||||
NULL, NULL, NULL, -1, -1, errorMessage);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+int qemudLoadDriverConfig(struct qemud_driver *driver,
|
|
||||||
+ const char *filename) {
|
|
||||||
+ virConfPtr conf;
|
|
||||||
+ virConfValuePtr p;
|
|
||||||
+
|
|
||||||
+ /* Setup 2 critical defaults */
|
|
||||||
+ strcpy(driver->vncListen, "127.0.0.1");
|
|
||||||
+ if (!(driver->vncTLSx509certdir = strdup(SYSCONF_DIR "/pki/libvirt-vnc"))) {
|
|
||||||
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY,
|
|
||||||
+ "vncTLSx509certdir");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Just check the file is readable before opening it, otherwise
|
|
||||||
+ * libvirt emits an error.
|
|
||||||
+ */
|
|
||||||
+ if (access (filename, R_OK) == -1) return 0;
|
|
||||||
+
|
|
||||||
+ conf = virConfReadFile (filename);
|
|
||||||
+ if (!conf) return 0;
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#define CHECK_TYPE(name,typ) if (p && p->type != (typ)) { \
|
|
||||||
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, \
|
|
||||||
+ "remoteReadConfigFile: %s: %s: expected type " #typ "\n", \
|
|
||||||
+ filename, (name)); \
|
|
||||||
+ virConfFree(conf); \
|
|
||||||
+ return -1; \
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ p = virConfGetValue (conf, "vnc_tls");
|
|
||||||
+ CHECK_TYPE ("vnc_tls", VIR_CONF_LONG);
|
|
||||||
+ if (p) driver->vncTLS = p->l;
|
|
||||||
+
|
|
||||||
+ p = virConfGetValue (conf, "vnc_tls_x509_verify");
|
|
||||||
+ CHECK_TYPE ("vnc_tls_x509_verify", VIR_CONF_LONG);
|
|
||||||
+ if (p) driver->vncTLSx509verify = p->l;
|
|
||||||
+
|
|
||||||
+ p = virConfGetValue (conf, "vnc_tls_x509_cert_dir");
|
|
||||||
+ CHECK_TYPE ("vnc_tls_x509_cert_dir", VIR_CONF_STRING);
|
|
||||||
+ if (p && p->str) {
|
|
||||||
+ free(driver->vncTLSx509certdir);
|
|
||||||
+ if (!(driver->vncTLSx509certdir = strdup(p->str))) {
|
|
||||||
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY,
|
|
||||||
+ "vncTLSx509certdir");
|
|
||||||
+ virConfFree(conf);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ p = virConfGetValue (conf, "vnc_listen");
|
|
||||||
+ CHECK_TYPE ("vnc_listen", VIR_CONF_STRING);
|
|
||||||
+ if (p && p->str) {
|
|
||||||
+ strncpy(driver->vncListen, p->str, sizeof(driver->vncListen));
|
|
||||||
+ driver->vncListen[sizeof(driver->vncListen)-1] = '\0';
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ virConfFree (conf);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
struct qemud_vm *qemudFindVMByID(const struct qemud_driver *driver, int id) {
|
|
||||||
struct qemud_vm *vm = driver->vms;
|
|
||||||
@@ -1234,7 +1297,7 @@ static struct qemud_vm_def *qemudParseXM
|
|
||||||
if (vnclisten && *vnclisten)
|
|
||||||
strncpy(def->vncListen, (char *)vnclisten, BR_INET_ADDR_MAXLEN-1);
|
|
||||||
else
|
|
||||||
- strcpy(def->vncListen, "127.0.0.1");
|
|
||||||
+ strcpy(def->vncListen, driver->vncListen);
|
|
||||||
def->vncListen[BR_INET_ADDR_MAXLEN-1] = '\0';
|
|
||||||
xmlFree(vncport);
|
|
||||||
xmlFree(vnclisten);
|
|
||||||
@@ -1750,15 +1813,30 @@ int qemudBuildCommandLine(virConnectPtr
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vm->def->graphicsType == QEMUD_GRAPHICS_VNC) {
|
|
||||||
- char vncdisplay[BR_INET_ADDR_MAXLEN+20];
|
|
||||||
+ char vncdisplay[PATH_MAX];
|
|
||||||
int ret;
|
|
||||||
- if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON)
|
|
||||||
- ret = snprintf(vncdisplay, sizeof(vncdisplay), "%s:%d",
|
|
||||||
+
|
|
||||||
+ if (vm->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) {
|
|
||||||
+ char options[PATH_MAX] = "";
|
|
||||||
+ if (driver->vncTLS) {
|
|
||||||
+ strcat(options, ",tls");
|
|
||||||
+ if (driver->vncTLSx509verify) {
|
|
||||||
+ strcat(options, ",x509verify=");
|
|
||||||
+ } else {
|
|
||||||
+ strcat(options, ",x509=");
|
|
||||||
+ }
|
|
||||||
+ strncat(options, driver->vncTLSx509certdir,
|
|
||||||
+ sizeof(options) - (strlen(driver->vncTLSx509certdir)-1));
|
|
||||||
+ options[sizeof(options)-1] = '\0';
|
|
||||||
+ }
|
|
||||||
+ ret = snprintf(vncdisplay, sizeof(vncdisplay), "%s:%d%s",
|
|
||||||
vm->def->vncListen,
|
|
||||||
- vm->def->vncActivePort - 5900);
|
|
||||||
- else
|
|
||||||
+ vm->def->vncActivePort - 5900,
|
|
||||||
+ options);
|
|
||||||
+ } else {
|
|
||||||
ret = snprintf(vncdisplay, sizeof(vncdisplay), "%d",
|
|
||||||
vm->def->vncActivePort - 5900);
|
|
||||||
+ }
|
|
||||||
if (ret < 0 || ret >= (int)sizeof(vncdisplay))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
diff -r 522efe7f7e8f -r c48e81e685a3 src/qemu_conf.h
|
|
||||||
--- a/src/qemu_conf.h Wed Oct 10 18:46:17 2007 +0000
|
|
||||||
+++ b/src/qemu_conf.h Fri Oct 12 15:05:44 2007 +0000
|
|
||||||
@@ -289,6 +289,10 @@ struct qemud_driver {
|
|
||||||
char *networkConfigDir;
|
|
||||||
char *networkAutostartDir;
|
|
||||||
char logDir[PATH_MAX];
|
|
||||||
+ int vncTLS : 1;
|
|
||||||
+ int vncTLSx509verify : 1;
|
|
||||||
+ char *vncTLSx509certdir;
|
|
||||||
+ char vncListen[BR_INET_ADDR_MAXLEN];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
@@ -311,6 +315,8 @@ void qemudReportError(virConnectPtr conn
|
|
||||||
ATTRIBUTE_FORMAT(printf,5,6);
|
|
||||||
|
|
||||||
|
|
||||||
+int qemudLoadDriverConfig(struct qemud_driver *driver,
|
|
||||||
+ const char *filename);
|
|
||||||
|
|
||||||
struct qemud_vm *qemudFindVMByID(const struct qemud_driver *driver,
|
|
||||||
int id);
|
|
||||||
diff -r 522efe7f7e8f -r c48e81e685a3 src/qemu_driver.c
|
|
||||||
--- a/src/qemu_driver.c Wed Oct 10 18:46:17 2007 +0000
|
|
||||||
+++ b/src/qemu_driver.c Fri Oct 12 15:05:44 2007 +0000
|
|
||||||
@@ -155,6 +155,7 @@ qemudStartup(void) {
|
|
||||||
uid_t uid = geteuid();
|
|
||||||
struct passwd *pw;
|
|
||||||
char *base = NULL;
|
|
||||||
+ char driverConf[PATH_MAX];
|
|
||||||
|
|
||||||
if (!(qemu_driver = calloc(1, sizeof(struct qemud_driver)))) {
|
|
||||||
return -1;
|
|
||||||
@@ -167,7 +168,7 @@ qemudStartup(void) {
|
|
||||||
if (snprintf(qemu_driver->logDir, PATH_MAX, "%s/log/libvirt/qemu", LOCAL_STATE_DIR) >= PATH_MAX)
|
|
||||||
goto snprintf_error;
|
|
||||||
|
|
||||||
- if ((base = strdup (SYSCONF_DIR "/libvirt/qemu")) == NULL)
|
|
||||||
+ if ((base = strdup (SYSCONF_DIR "/libvirt")) == NULL)
|
|
||||||
goto out_of_memory;
|
|
||||||
} else {
|
|
||||||
if (!(pw = getpwuid(uid))) {
|
|
||||||
@@ -179,7 +180,7 @@ qemudStartup(void) {
|
|
||||||
if (snprintf(qemu_driver->logDir, PATH_MAX, "%s/.libvirt/qemu/log", pw->pw_dir) >= PATH_MAX)
|
|
||||||
goto snprintf_error;
|
|
||||||
|
|
||||||
- if (asprintf (&base, "%s/.libvirt/qemu", pw->pw_dir) == -1) {
|
|
||||||
+ if (asprintf (&base, "%s/.libvirt", pw->pw_dir) == -1) {
|
|
||||||
qemudLog (QEMUD_ERR, "out of memory in asprintf");
|
|
||||||
goto out_of_memory;
|
|
||||||
}
|
|
||||||
@@ -188,24 +189,36 @@ qemudStartup(void) {
|
|
||||||
/* Configuration paths are either ~/.libvirt/qemu/... (session) or
|
|
||||||
* /etc/libvirt/qemu/... (system).
|
|
||||||
*/
|
|
||||||
- if (asprintf (&qemu_driver->configDir, "%s", base) == -1)
|
|
||||||
+ if (snprintf (driverConf, sizeof(driverConf), "%s/qemu.conf", base) == -1)
|
|
||||||
goto out_of_memory;
|
|
||||||
-
|
|
||||||
- if (asprintf (&qemu_driver->autostartDir, "%s/autostart", base) == -1)
|
|
||||||
+ driverConf[sizeof(driverConf)-1] = '\0';
|
|
||||||
+
|
|
||||||
+ if (asprintf (&qemu_driver->configDir, "%s/qemu", base) == -1)
|
|
||||||
goto out_of_memory;
|
|
||||||
|
|
||||||
- if (asprintf (&qemu_driver->networkConfigDir, "%s/networks", base) == -1)
|
|
||||||
+ if (asprintf (&qemu_driver->autostartDir, "%s/qemu/autostart", base) == -1)
|
|
||||||
goto out_of_memory;
|
|
||||||
|
|
||||||
- if (asprintf (&qemu_driver->networkAutostartDir, "%s/networks/autostart",
|
|
||||||
+ if (asprintf (&qemu_driver->networkConfigDir, "%s/qemu/networks", base) == -1)
|
|
||||||
+ goto out_of_memory;
|
|
||||||
+
|
|
||||||
+ if (asprintf (&qemu_driver->networkAutostartDir, "%s/qemu/networks/autostart",
|
|
||||||
base) == -1)
|
|
||||||
goto out_of_memory;
|
|
||||||
|
|
||||||
- if (qemudScanConfigs(qemu_driver) < 0)
|
|
||||||
+ free(base);
|
|
||||||
+
|
|
||||||
+ if (qemudLoadDriverConfig(qemu_driver, driverConf) < 0) {
|
|
||||||
qemudShutdown();
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (qemudScanConfigs(qemu_driver) < 0) {
|
|
||||||
+ qemudShutdown();
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
qemudAutostartConfigs(qemu_driver);
|
|
||||||
|
|
||||||
- free(base);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
snprintf_error:
|
|
||||||
|
|
||||||
30
libvirt-0.6.2-avoid-broken-networking-with-newer-qemu.patch
Normal file
30
libvirt-0.6.2-avoid-broken-networking-with-newer-qemu.patch
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
From 6e80c60b89728de28267242f7373ecf553e40bc1 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] Avoid broken networking with new QEMU/KVM >= 86
|
||||||
|
|
||||||
|
(cherry picked from commit 2afc3bfd8b779ddba974da9d66d6ea337fc91c01)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-avoid-broken-networking-with-newer-qemu.patch
|
||||||
|
---
|
||||||
|
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 fc0e772..99f13c6 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.2.5
|
||||||
|
|
||||||
49
libvirt-0.6.2-bring-up-ipless-bridge.patch
Normal file
49
libvirt-0.6.2-bring-up-ipless-bridge.patch
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
From 6635abc3bbe54e6b0168182805de92cd70d125e4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel Veillard <veillard@redhat.com>
|
||||||
|
Date: Tue, 12 May 2009 15:31:22 +0000
|
||||||
|
Subject: [PATCH] * src/network_driver.c: enable bridges which are not up without an IP address, patch by Ludwig Nussel
|
||||||
|
|
||||||
|
(cherry picked from commit e978774ec67f4b062b1f65e5c76a13193a9430eb)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-bring-up-ipless-bridge.patch
|
||||||
|
---
|
||||||
|
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.2.5
|
||||||
|
|
||||||
33
libvirt-0.6.2-buf-locale-escape.patch
Normal file
33
libvirt-0.6.2-buf-locale-escape.patch
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
From f793cd9b7220145b6df8086d77db4fdc035d680b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Tue, 4 Aug 2009 18:13:09 +0100
|
||||||
|
Subject: [PATCH] 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
|
||||||
|
|
||||||
|
(cherry picked from commit 8feb499ba2c3625632210c997b49f5df515c05d4)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-buf-locale-escape.patch
|
||||||
|
---
|
||||||
|
src/buf.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
208
libvirt-0.6.2-do-not-log-monitor-output.patch
Normal file
208
libvirt-0.6.2-do-not-log-monitor-output.patch
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
From 182a3cac2b4339e988802eb02279e7ab4c883c67 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] Don't log monitor output to domain log file.
|
||||||
|
|
||||||
|
It's logged via the logging system already. Prefix monitor debug output with vm
|
||||||
|
name.
|
||||||
|
|
||||||
|
(cherry picked from commit 5caa1e0eb050a12fe8ed02cf635bb672a56cdb6f)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-do-not-log-monitor-output.patch
|
||||||
|
---
|
||||||
|
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 5ca3d20..cb738b2 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1706,27 +1706,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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2461,7 +2445,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;
|
||||||
|
@@ -2515,7 +2499,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;
|
||||||
|
@@ -2810,7 +2794,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" */
|
||||||
|
@@ -3662,7 +3646,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);
|
||||||
|
@@ -3723,7 +3707,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 "
|
||||||
|
@@ -3791,7 +3775,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 ")) {
|
||||||
|
@@ -3845,7 +3829,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 ")) {
|
||||||
|
@@ -3984,7 +3968,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")) {
|
||||||
|
@@ -4214,7 +4198,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
|
||||||
|
@@ -4255,21 +4239,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, ' ');
|
||||||
|
@@ -4481,7 +4469,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) {
|
||||||
|
@@ -4798,7 +4786,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;
|
||||||
|
|
||||||
|
@@ -4815,7 +4803,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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -4834,7 +4822,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) {
|
||||||
|
@@ -4873,7 +4861,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.2.5
|
||||||
|
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
From 2d299525f5de29d11c6dc4810aa41e893535695b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 3 Jul 2009 10:27:46 +0000
|
||||||
|
Subject: [PATCH] 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)
|
||||||
|
|
||||||
|
(cherry picked from commit add254feeaa830dd5af1118c141cb140bf55b5a7)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-do-not-unnecessarily-try-to-change-a-file-context.patch
|
||||||
|
---
|
||||||
|
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 450fce2..8ebe1fe 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
|
||||||
|
|
||||||
48
libvirt-0.6.2-enable-qemu-0-10-migration.patch
Normal file
48
libvirt-0.6.2-enable-qemu-0-10-migration.patch
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
From 9b41d6550b6bf8d4450bb5b86550eb605cc1fd91 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Fri, 8 May 2009 10:07:15 +0000
|
||||||
|
Subject: [PATCH] Enable save/restore/migrate for QEMU >= 0.10.0
|
||||||
|
|
||||||
|
(cherry picked from commit 88e22e4e8cb7fc7e1fa1d132778aa1994f4b55b6)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-enable-qemu-0-10-migration.patch
|
||||||
|
---
|
||||||
|
src/qemu_conf.c | 10 +++++-----
|
||||||
|
1 files changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||||
|
index 6f9e610..929fe00 100644
|
||||||
|
--- a/src/qemu_conf.c
|
||||||
|
+++ b/src/qemu_conf.c
|
||||||
|
@@ -472,16 +472,13 @@ int qemudExtractVersionInfo(const char *qemu,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 *qemu,
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
147
libvirt-0.6.2-event-handling-1.patch
Normal file
147
libvirt-0.6.2-event-handling-1.patch
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
From 261ec2c9597b2eb6c7d91589fc66e203f60b6735 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] Fix interrupting of main event thread & protect against accidental uniniitalized variables
|
||||||
|
|
||||||
|
(cherry picked from commit 0a31be6ba243066378c344882cc1a32802774edb)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-event-handling-1.patch
|
||||||
|
---
|
||||||
|
qemud/event.c | 42 +++++++++++++++++++++++++++++++++++-------
|
||||||
|
1 files changed, 35 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/qemud/event.c b/qemud/event.c
|
||||||
|
index 0887008..4dc1020 100644
|
||||||
|
--- a/qemud/event.c
|
||||||
|
+++ b/qemud/event.c
|
||||||
|
@@ -83,10 +83,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)
|
||||||
|
{
|
||||||
|
@@ -142,15 +142,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();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -163,6 +170,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)
|
||||||
|
@@ -171,11 +184,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;
|
||||||
|
}
|
||||||
|
@@ -231,6 +244,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;
|
||||||
|
}
|
||||||
|
@@ -243,10 +262,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();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -259,6 +278,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)
|
||||||
|
@@ -266,11 +291,11 @@ int virEventRemoveTimeoutImpl(int timer) {
|
||||||
|
|
||||||
|
if (eventLoop.timeouts[i].timer == timer) {
|
||||||
|
eventLoop.timeouts[i].deleted = 1;
|
||||||
|
+ virEventInterruptLocked();
|
||||||
|
virEventUnlock();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- virEventInterruptLocked();
|
||||||
|
virEventUnlock();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -616,9 +641,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.2.5
|
||||||
|
|
||||||
200
libvirt-0.6.2-event-handling-2.patch
Normal file
200
libvirt-0.6.2-event-handling-2.patch
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
From ef1a3eaa58d83c3367a1addff6c8132f27aa09dd 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] Fix watch/timer event deletion
|
||||||
|
|
||||||
|
(cherry picked from commit 470317f5c71cbcc6b6d8d83d0978aea3510d3698)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-event-handling-2.patch
|
||||||
|
---
|
||||||
|
qemud/event.c | 112 ++++++++++++++++++++++++++-------------------------------
|
||||||
|
1 files changed, 51 insertions(+), 61 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/qemud/event.c b/qemud/event.c
|
||||||
|
index 4dc1020..8bc7c34 100644
|
||||||
|
--- a/qemud/event.c
|
||||||
|
+++ b/qemud/event.c
|
||||||
|
@@ -312,7 +312,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);
|
||||||
|
@@ -349,32 +349,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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -434,26 +428,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;
|
||||||
|
@@ -544,22 +542,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();
|
||||||
|
|
||||||
|
@@ -571,38 +568,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.2.5
|
||||||
|
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
From d8bd0cff27c0572e9305e7fdbc6b843f74d9e30f 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
|
||||||
|
|
||||||
|
(cherry picked from commit 39c7e7a6b79bbdfa36928a430d56fa88a204e8fd)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-fix-libvirtd-crash-with-bad-capabilities-data.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 80 +++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
1 files changed, 54 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index cb738b2..3d3675c 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -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 *qemud_drv)
|
||||||
|
}
|
||||||
|
|
||||||
|
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(virConnectPtr conn,
|
||||||
|
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
37
libvirt-0.6.2-fix-nosource-label.patch
Normal file
37
libvirt-0.6.2-fix-nosource-label.patch
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
From 99c018831379f23e65860ad4f3628a6d5f1a7d5a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 3 Jul 2009 10:29:09 +0000
|
||||||
|
Subject: [PATCH] Skip labelling if no src path present
|
||||||
|
|
||||||
|
Fixes startup of guest's with sourceless cdrom devices.
|
||||||
|
|
||||||
|
Patch from Cole Robinson originally posted here:
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/499569
|
||||||
|
|
||||||
|
but never sent upstream.
|
||||||
|
|
||||||
|
(cherry picked from commit 67d0c6eb9410d5101f4820a7286deacb6398afde)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-fix-nosource-label.patch
|
||||||
|
---
|
||||||
|
src/security_selinux.c | 3 +++
|
||||||
|
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/security_selinux.c b/src/security_selinux.c
|
||||||
|
index 95fa0a6..450fce2 100644
|
||||||
|
--- a/src/security_selinux.c
|
||||||
|
+++ b/src/security_selinux.c
|
||||||
|
@@ -338,6 +338,9 @@ SELinuxSetSecurityImageLabel(virConnectPtr conn,
|
||||||
|
{
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
85
libvirt-0.6.2-fix-qemu-argv-detection-with-kvm-85.patch
Normal file
85
libvirt-0.6.2-fix-qemu-argv-detection-with-kvm-85.patch
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
From 9f6a5f50aee13575331f79f5d93635f701646eb7 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] Fix QEMU ARGV detection with kvm >= 85
|
||||||
|
|
||||||
|
(cherry picked from commit 426f9772b84752b4901b72fd382ff6e28e258efd)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-fix-qemu-argv-detection-with-kvm-85.patch
|
||||||
|
---
|
||||||
|
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 929fe00..3e7e32d 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 4752a64..5ca3d20 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1379,12 +1379,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;
|
||||||
|
@@ -3606,12 +3602,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.2.5
|
||||||
|
|
||||||
46
libvirt-0.6.2-hotplug-labelling.patch
Normal file
46
libvirt-0.6.2-hotplug-labelling.patch
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
From 0aac99f8e13dfc74b87986908165ae7f44662153 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Mon, 6 Jul 2009 16:01:55 +0100
|
||||||
|
Subject: [PATCH] Fix SELinux denial during hotplug
|
||||||
|
|
||||||
|
* src/qemu_driver.c: Relabel disk images *before* running QEMU
|
||||||
|
hotplug monitor commands
|
||||||
|
|
||||||
|
(cherry picked from commit 1795bfe4a177a5eff1b3b0a16d56df6f371c0f8e)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-hotplug-labelling.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 6 ++++--
|
||||||
|
1 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index 5fc21a1..f3661f8 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -3934,10 +3934,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 ||
|
||||||
|
@@ -3949,8 +3953,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.6.2.5
|
||||||
|
|
||||||
134
libvirt-0.6.2-hotplug-monitor-syntax.patch
Normal file
134
libvirt-0.6.2-hotplug-monitor-syntax.patch
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
From ae80f9ec15b03d9d3ab6cfa2d48529b459a64fb2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Mon, 6 Jul 2009 15:58:55 +0100
|
||||||
|
Subject: [PATCH] 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
|
||||||
|
|
||||||
|
(cherry picked from commit 326ecb78145cfeb7706ef0dcd521b19d934950e7)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-hotplug-monitor-syntax.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 56 +++++++++++++++++++++++++++++++++++++++-------------
|
||||||
|
1 files changed, 42 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index f3661f8..8473616 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -3724,6 +3724,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)) {
|
||||||
|
@@ -3738,14 +3739,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);
|
||||||
|
@@ -3761,17 +3763,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;
|
||||||
|
@@ -3990,6 +4002,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)) {
|
||||||
|
@@ -4011,9 +4024,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) {
|
||||||
|
@@ -4023,12 +4044,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.6.2.5
|
||||||
|
|
||||||
57
libvirt-0.6.2-libvirtd-double-free.patch
Normal file
57
libvirt-0.6.2-libvirtd-double-free.patch
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
From 2c42e4c96efd390fa7a6957692a5863d30a10828 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] Avoid double-free in daemon client cleanup code
|
||||||
|
|
||||||
|
(cherry picked from commit 6c3ef350649b959215cfc5ccfdaba35bf9560066)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-libvirtd-double-free.patch
|
||||||
|
---
|
||||||
|
qemud/qemud.c | 22 +++++++++++++++++-----
|
||||||
|
1 files changed, 17 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/qemud/qemud.c b/qemud/qemud.c
|
||||||
|
index 4f04355..e299a67 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 +1409,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.2.5
|
||||||
|
|
||||||
60
libvirt-0.6.2-monitor-prompt-discard.patch
Normal file
60
libvirt-0.6.2-monitor-prompt-discard.patch
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
From eb2fad7e94ba9bf48787e24542931688b9926ca1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Mon, 6 Jul 2009 15:45:04 +0100
|
||||||
|
Subject: [PATCH] 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.
|
||||||
|
|
||||||
|
(cherry picked from commit 2d1f2e706c8b13571e1227df1c69b2302da35d5a)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-monitor-prompt-discard.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 24 ++++++++++++++++++++++++
|
||||||
|
1 files changed, 24 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index 3d3675c..5fc21a1 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1636,6 +1636,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,
|
||||||
|
@@ -1647,6 +1669,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.6.2.5
|
||||||
|
|
||||||
159
libvirt-0.6.2-numa-ignore-fail.patch
Normal file
159
libvirt-0.6.2-numa-ignore-fail.patch
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
From 3cf2f90a4747547f9877b15c1f573f8a771098e8 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
|
||||||
|
|
||||||
|
(cherry picked from commit 39c7e7a6b79bbdfa36928a430d56fa88a204e8fd)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-numa-ignore-fail.patch
|
||||||
|
---
|
||||||
|
src/capabilities.c | 16 +++++++++++++---
|
||||||
|
src/capabilities.h | 3 +++
|
||||||
|
src/libvirt_private.syms | 1 +
|
||||||
|
src/lxc_conf.c | 11 +++++++++--
|
||||||
|
src/qemu_conf.c | 10 ++++++++--
|
||||||
|
src/uml_conf.c | 11 +++++++++--
|
||||||
|
6 files changed, 43 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/capabilities.c b/src/capabilities.c
|
||||||
|
index d6e3478..8dc32a1 100644
|
||||||
|
--- a/src/capabilities.c
|
||||||
|
+++ b/src/capabilities.c
|
||||||
|
@@ -122,6 +122,18 @@ virCapabilitiesFreeGuest(virCapsGuestPtr guest)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+void
|
||||||
|
+virCapabilitiesFreeNUMAInfo(virCapsPtr caps)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0 ; i < caps->host.nnumaCell ; i++)
|
||||||
|
+ virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]);
|
||||||
|
+ VIR_FREE(caps->host.numaCell);
|
||||||
|
+ caps->host.nnumaCell = 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* virCapabilitiesFree:
|
||||||
|
* @caps: object to free
|
||||||
|
@@ -141,9 +153,7 @@ virCapabilitiesFree(virCapsPtr caps) {
|
||||||
|
for (i = 0 ; i < caps->host.nfeatures ; i++)
|
||||||
|
VIR_FREE(caps->host.features[i]);
|
||||||
|
VIR_FREE(caps->host.features);
|
||||||
|
- for (i = 0 ; i < caps->host.nnumaCell ; i++)
|
||||||
|
- virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]);
|
||||||
|
- VIR_FREE(caps->host.numaCell);
|
||||||
|
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||||
|
|
||||||
|
for (i = 0 ; i < caps->host.nmigrateTrans ; i++)
|
||||||
|
VIR_FREE(caps->host.migrateTrans[i]);
|
||||||
|
diff --git a/src/capabilities.h b/src/capabilities.h
|
||||||
|
index 5b0bbab..1b49666 100644
|
||||||
|
--- a/src/capabilities.h
|
||||||
|
+++ b/src/capabilities.h
|
||||||
|
@@ -118,6 +118,9 @@ extern void
|
||||||
|
virCapabilitiesFree(virCapsPtr caps);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
+virCapabilitiesFreeNUMAInfo(virCapsPtr caps);
|
||||||
|
+
|
||||||
|
+extern void
|
||||||
|
virCapabilitiesSetMacPrefix(virCapsPtr caps,
|
||||||
|
unsigned char *prefix);
|
||||||
|
|
||||||
|
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||||
|
index 350a931..9249a1a 100644
|
||||||
|
--- a/src/libvirt_private.syms
|
||||||
|
+++ b/src/libvirt_private.syms
|
||||||
|
@@ -24,6 +24,7 @@ virCapabilitiesDefaultGuestEmulator;
|
||||||
|
virCapabilitiesDefaultGuestMachine;
|
||||||
|
virCapabilitiesFormatXML;
|
||||||
|
virCapabilitiesFree;
|
||||||
|
+virCapabilitiesFreeNUMAInfo;
|
||||||
|
virCapabilitiesNew;
|
||||||
|
virCapabilitiesSetMacPrefix;
|
||||||
|
virCapabilitiesGenerateMac;
|
||||||
|
diff --git a/src/lxc_conf.c b/src/lxc_conf.c
|
||||||
|
index 34c8aea..fe721e3 100644
|
||||||
|
--- a/src/lxc_conf.c
|
||||||
|
+++ b/src/lxc_conf.c
|
||||||
|
@@ -30,6 +30,7 @@
|
||||||
|
#include "lxc_conf.h"
|
||||||
|
#include "nodeinfo.h"
|
||||||
|
#include "virterror_internal.h"
|
||||||
|
+#include "logging.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_LXC
|
||||||
|
|
||||||
|
@@ -46,8 +47,14 @@ virCapsPtr lxcCapsInit(void)
|
||||||
|
0, 0)) == NULL)
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
- if (virCapsInitNUMA(caps) < 0)
|
||||||
|
- goto no_memory;
|
||||||
|
+ /* Some machines have problematic NUMA toplogy causing
|
||||||
|
+ * unexpected failures. We don't want to break the QEMU
|
||||||
|
+ * driver in this scenario, so log errors & carry on
|
||||||
|
+ */
|
||||||
|
+ if (virCapsInitNUMA(caps) < 0) {
|
||||||
|
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||||
|
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* XXX shouldn't 'borrow' KVM's prefix */
|
||||||
|
virCapabilitiesSetMacPrefix(caps, (unsigned char []){ 0x52, 0x54, 0x00 });
|
||||||
|
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||||
|
index 99f13c6..1194e36 100644
|
||||||
|
--- a/src/qemu_conf.c
|
||||||
|
+++ b/src/qemu_conf.c
|
||||||
|
@@ -376,8 +376,14 @@ virCapsPtr qemudCapsInit(void) {
|
||||||
|
/* Using KVM's mac prefix for QEMU too */
|
||||||
|
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x52, 0x54, 0x00 });
|
||||||
|
|
||||||
|
- if (virCapsInitNUMA(caps) < 0)
|
||||||
|
- goto no_memory;
|
||||||
|
+ /* Some machines have problematic NUMA toplogy causing
|
||||||
|
+ * unexpected failures. We don't want to break the QEMU
|
||||||
|
+ * driver in this scenario, so log errors & carry on
|
||||||
|
+ */
|
||||||
|
+ if (virCapsInitNUMA(caps) < 0) {
|
||||||
|
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||||
|
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* First the pure HVM guests */
|
||||||
|
for (i = 0 ; i < ARRAY_CARDINALITY(arch_info_hvm) ; i++)
|
||||||
|
diff --git a/src/uml_conf.c b/src/uml_conf.c
|
||||||
|
index c0d086e..9dd4967 100644
|
||||||
|
--- a/src/uml_conf.c
|
||||||
|
+++ b/src/uml_conf.c
|
||||||
|
@@ -44,6 +44,7 @@
|
||||||
|
#include "memory.h"
|
||||||
|
#include "nodeinfo.h"
|
||||||
|
#include "verify.h"
|
||||||
|
+#include "logging.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_UML
|
||||||
|
|
||||||
|
@@ -62,8 +63,14 @@ virCapsPtr umlCapsInit(void) {
|
||||||
|
0, 0)) == NULL)
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
- if (virCapsInitNUMA(caps) < 0)
|
||||||
|
- goto no_memory;
|
||||||
|
+ /* Some machines have problematic NUMA toplogy causing
|
||||||
|
+ * unexpected failures. We don't want to break the QEMU
|
||||||
|
+ * driver in this scenario, so log errors & carry on
|
||||||
|
+ */
|
||||||
|
+ if (virCapsInitNUMA(caps) < 0) {
|
||||||
|
+ virCapabilitiesFreeNUMAInfo(caps);
|
||||||
|
+ VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((guest = virCapabilitiesAddGuest(caps,
|
||||||
|
"uml",
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
31
libvirt-0.6.2-pci-device-crash.patch
Normal file
31
libvirt-0.6.2-pci-device-crash.patch
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
From d5d67ea357d92759d4a9ecb213e577835f961eed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Thu, 16 Jul 2009 13:23:32 +0100
|
||||||
|
Subject: [PATCH] Fix free of unitialized data upon PCI open fail
|
||||||
|
|
||||||
|
(cherry picked from commit 4a7acedd3c59a6a750576cb8680bc3f08fe0b52c)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-pci-device-crash.patch
|
||||||
|
---
|
||||||
|
src/pci.c | 4 +---
|
||||||
|
1 files changed, 1 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/pci.c b/src/pci.c
|
||||||
|
index ed64d68..68a380d 100644
|
||||||
|
--- a/src/pci.c
|
||||||
|
+++ b/src/pci.c
|
||||||
|
@@ -829,10 +829,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.6.2.5
|
||||||
|
|
||||||
31
libvirt-0.6.2-qemu-drive-format.patch
Normal file
31
libvirt-0.6.2-qemu-drive-format.patch
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
From bf7b58a2471a07111f8022c0176f45ee5dc5fe71 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Thu, 16 Apr 2009 14:21:35 +0000
|
||||||
|
Subject: [PATCH] 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=".
|
||||||
|
|
||||||
|
(cherry picked from commit 9fa79000ecc883c699a6cb1ce7f00c34881bc8fe)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-qemu-drive-format.patch
|
||||||
|
---
|
||||||
|
src/qemu_conf.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
176
libvirt-0.6.2-qemu-name-uniqueness.patch
Normal file
176
libvirt-0.6.2-qemu-name-uniqueness.patch
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
From 1f1a0ca63c5492c7d41a0cdbd452a2743f314ebc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Fri, 8 May 2009 10:11:14 +0000
|
||||||
|
Subject: [PATCH] Improve name & UUID uniqueness checking in QEMU driver
|
||||||
|
|
||||||
|
(cherry picked from commit 54ebbde1e18ec831ff2fddb44ec27ed5dde7874a)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-qemu-name-uniqueness.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 103 ++++++++++++++++++++++++++++++++++++++++++----------
|
||||||
|
1 files changed, 83 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index 8473616..dfd19c5 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -2174,22 +2174,37 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
|
||||||
|
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(virDomainPtr dom) {
|
||||||
|
_("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(virConnectPtr conn,
|
||||||
|
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(virConnectPtr conn, const char *xml) {
|
||||||
|
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(virConnectPtr conn, const char *xml) {
|
||||||
|
if (dom) dom->id = vm->def->id;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
+ virDomainDefFree(def);
|
||||||
|
if (vm)
|
||||||
|
virDomainObjUnlock(vm);
|
||||||
|
if (event)
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
56
libvirt-0.6.2-qemu-ppc-machine-type.patch
Normal file
56
libvirt-0.6.2-qemu-ppc-machine-type.patch
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
From 5c1ff776a3194bcc5d593aedd36cd676f1fcab64 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel Veillard <veillard@redhat.com>
|
||||||
|
Date: Fri, 29 May 2009 13:32:06 +0000
|
||||||
|
Subject: [PATCH] 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
|
||||||
|
|
||||||
|
(cherry picked from commit 525c3d40a97a1ccce7c4dc314d2dd9e780b50d41)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-qemu-ppc-machine-type.patch
|
||||||
|
---
|
||||||
|
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 2f784e1..b29079a 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 3e7e32d..fc0e772 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.2.5
|
||||||
|
|
||||||
100
libvirt-0.6.2-shared-readonly-label.patch
Normal file
100
libvirt-0.6.2-shared-readonly-label.patch
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
From 36cf92efa2b22f275bdc56411d9704e530cdb3fa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 3 Jul 2009 10:26:37 +0000
|
||||||
|
Subject: [PATCH] Re-label shared and readonly images
|
||||||
|
|
||||||
|
This patch was posted ages ago here:
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/493692
|
||||||
|
|
||||||
|
But was never posted upstream AFAICT.
|
||||||
|
|
||||||
|
Patch from Dan Berrange
|
||||||
|
|
||||||
|
(cherry picked from commit 547147084d03ebf30d09d242a5a721a4df664ffe)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-shared-readonly-label.patch
|
||||||
|
---
|
||||||
|
src/security_selinux.c | 26 +++++++++++++++++++-------
|
||||||
|
1 files changed, 19 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/security_selinux.c b/src/security_selinux.c
|
||||||
|
index ac317d7..95fa0a6 100644
|
||||||
|
--- a/src/security_selinux.c
|
||||||
|
+++ b/src/security_selinux.c
|
||||||
|
@@ -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, const char *path, char *tcon)
|
||||||
|
{
|
||||||
|
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(virConnectPtr conn,
|
||||||
|
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(virConnectPtr conn,
|
||||||
|
{
|
||||||
|
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 conn,
|
||||||
|
|
||||||
|
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.6.2.5
|
||||||
|
|
||||||
51
libvirt-0.6.2-svirt-sound.patch
Normal file
51
libvirt-0.6.2-svirt-sound.patch
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
From e76837af35d692cb947db3a47058bcfbbf77b46a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Mon, 17 Aug 2009 08:52:30 +0100
|
||||||
|
Subject: [PATCH] Disable sound cards when running sVirt
|
||||||
|
|
||||||
|
Temporary hack till PulseAudio autostart problems are sorted out when
|
||||||
|
SELinux enforcing (bz 486112)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-svirt-sound.patch
|
||||||
|
---
|
||||||
|
src/qemu_conf.c | 17 ++++++++++++++++-
|
||||||
|
1 files changed, 16 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||||||
|
index 1194e36..f42aeaa 100644
|
||||||
|
--- a/src/qemu_conf.c
|
||||||
|
+++ b/src/qemu_conf.c
|
||||||
|
@@ -795,6 +795,20 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||||
|
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);
|
||||||
|
|
||||||
|
@@ -1441,7 +1455,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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.6.2.5
|
||||||
|
|
||||||
49
libvirt-0.6.2-xml-attribute-escaping.patch
Normal file
49
libvirt-0.6.2-xml-attribute-escaping.patch
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
From a7d81a2f9e80942c9951c1d16ad69c66b9a47bbb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel Veillard <veillard@redhat.com>
|
||||||
|
Date: Wed, 13 May 2009 16:19:59 +0000
|
||||||
|
Subject: [PATCH] * src/buf.c: avoid an XML attribute escaping bug #499791 daniel
|
||||||
|
|
||||||
|
(cherry picked from commit 7afe94e7e236ec465d838e7d60e961975c526ab2)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.2-xml-attribute-escaping.patch
|
||||||
|
---
|
||||||
|
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.2.5
|
||||||
|
|
||||||
47
libvirt-0.6.3-hostdev-managed.patch
Normal file
47
libvirt-0.6.3-hostdev-managed.patch
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
From b3f02d5528c121bcf7b9ac5c4284517e71a5e2f2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Wed, 6 May 2009 15:56:20 +0000
|
||||||
|
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.
|
||||||
|
|
||||||
|
(cherry picked from commit 1d6c713b18741f1a0e3d0ccd094275a11aef138c)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.3-hostdev-managed.patch
|
||||||
|
---
|
||||||
|
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 79ee072..162d072 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.2.5
|
||||||
|
|
||||||
85
libvirt-0.6.3-refresh-qemu-caps.patch
Normal file
85
libvirt-0.6.3-refresh-qemu-caps.patch
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
From a521796bac21f0c8af38a8551a420d87b61c7a9a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Cole Robinson <crobinso@redhat.com>
|
||||||
|
Date: Wed, 6 May 2009 14:20:34 +0000
|
||||||
|
Subject: [PATCH] Refresh QEMU driver capabilities for each getCapabilities call.
|
||||||
|
|
||||||
|
Also fix up a couple issues where caps are accessed without locking
|
||||||
|
the driver structure.
|
||||||
|
|
||||||
|
(cherry picked from commit 4f107590243631869677ddea2bb667db4a1282a6)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-0.6.3-refresh-qemu-caps.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 28 ++++++++++++++++++++--------
|
||||||
|
1 files changed, 20 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index 162d072..4752a64 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1872,10 +1872,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);
|
||||||
|
|
||||||
|
@@ -3142,20 +3144,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);
|
||||||
|
|
||||||
|
@@ -3164,10 +3172,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 */
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
60
libvirt-add-space-to-nodedev-list-tree.patch
Normal file
60
libvirt-add-space-to-nodedev-list-tree.patch
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
From b77d11b221862343d304e11ed878e2f176101f24 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Date: Tue, 28 Apr 2009 10:55:45 +0000
|
||||||
|
Subject: [PATCH] Cosmetic change to 'virsh nodedev-list --tree' output
|
||||||
|
|
||||||
|
Maybe it's just me, but I try to select an item from the tree using
|
||||||
|
double-click and get annoyed when "+-" gets included in the selection.
|
||||||
|
|
||||||
|
* src/virsh.c: add a space between "+-" and the node device name
|
||||||
|
in 'virsh nodedev-list --tree'
|
||||||
|
|
||||||
|
(cherry picked from commit cb4a6614fae48d05f09b7b15328ea6ef4071ccb3)
|
||||||
|
(cherry picked from commit 097c818bf00b3777778ffc32fea3a6ed1e741e2b)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-add-space-to-nodedev-list-tree.patch
|
||||||
|
---
|
||||||
|
src/virsh.c | 10 ++++++----
|
||||||
|
1 files changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/virsh.c b/src/virsh.c
|
||||||
|
index 26764a7..c92bb8f 100644
|
||||||
|
--- a/src/virsh.c
|
||||||
|
+++ b/src/virsh.c
|
||||||
|
@@ -4460,10 +4460,12 @@ cmdNodeListDevicesPrint(vshControl *ctl,
|
||||||
|
if (depth && depth < MAX_DEPTH) {
|
||||||
|
indentBuf[indentIdx] = '+';
|
||||||
|
indentBuf[indentIdx+1] = '-';
|
||||||
|
+ indentBuf[indentIdx+2] = ' ';
|
||||||
|
+ indentBuf[indentIdx+3] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print this device */
|
||||||
|
- vshPrint(ctl, indentBuf);
|
||||||
|
+ vshPrint(ctl, "%s", indentBuf);
|
||||||
|
vshPrint(ctl, "%s\n", devices[devid]);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -4487,8 +4489,8 @@ cmdNodeListDevicesPrint(vshControl *ctl,
|
||||||
|
|
||||||
|
/* If there is a child device, then print another blank line */
|
||||||
|
if (nextlastdev != -1) {
|
||||||
|
- vshPrint(ctl, indentBuf);
|
||||||
|
- vshPrint(ctl, " |\n");
|
||||||
|
+ vshPrint(ctl, "%s", indentBuf);
|
||||||
|
+ vshPrint(ctl, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally print all children */
|
||||||
|
@@ -4511,7 +4513,7 @@ cmdNodeListDevicesPrint(vshControl *ctl,
|
||||||
|
/* If there was no child device, and we're the last in
|
||||||
|
* a list of devices, then print another blank line */
|
||||||
|
if (nextlastdev == -1 && devid == lastdev) {
|
||||||
|
- vshPrint(ctl, indentBuf);
|
||||||
|
+ vshPrint(ctl, "%s", indentBuf);
|
||||||
|
vshPrint(ctl, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
812
libvirt-allow-pci-hostdev-reset-to-reset-other-devices.patch
Normal file
812
libvirt-allow-pci-hostdev-reset-to-reset-other-devices.patch
Normal file
@@ -0,0 +1,812 @@
|
|||||||
|
From 6878a049e27f2eaea7bd3d5c266a2d2b39e444f1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Mon, 17 Aug 2009 15:05:23 +0100
|
||||||
|
Subject: [PATCH] Maintain a list of active PCI hostdevs and use it in pciResetDevice()
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/499678
|
||||||
|
|
||||||
|
First we add a pciDeviceList type and add a qemuGetPciHostDeviceList()
|
||||||
|
function to build a list from a domain definition. Use this in
|
||||||
|
prepare/re-attach to simplify things and eliminate the multiple
|
||||||
|
pciGetDevice() calls.
|
||||||
|
|
||||||
|
Then, as we start/shutdown guests we can add or delete devices as
|
||||||
|
appropriate from a list of active devices.
|
||||||
|
|
||||||
|
Finally, in pciReset(), we can use this to determine whether its safe to
|
||||||
|
reset a device as a side effect of resetting another device.
|
||||||
|
|
||||||
|
(cherry picked from commit 78675b228b76a83f83d64856bfb63b9e14c103a0)
|
||||||
|
(cherry picked from commit e8ad33931296c67de0538e78d12e21706a826d37)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-allow-pci-hostdev-reset-to-reset-other-devices.patch
|
||||||
|
---
|
||||||
|
src/libvirt_private.syms | 7 +-
|
||||||
|
src/pci.c | 211 +++++++++++++++++++++++++++++++++--------
|
||||||
|
src/pci.h | 23 +++++-
|
||||||
|
src/qemu_conf.h | 3 +
|
||||||
|
src/qemu_driver.c | 237 +++++++++++++++++++++++++++-------------------
|
||||||
|
src/xen_unified.c | 2 +-
|
||||||
|
6 files changed, 339 insertions(+), 144 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||||
|
index 9249a1a..75ddda8 100644
|
||||||
|
--- a/src/libvirt_private.syms
|
||||||
|
+++ b/src/libvirt_private.syms
|
||||||
|
@@ -240,7 +240,12 @@ pciFreeDevice;
|
||||||
|
pciDettachDevice;
|
||||||
|
pciReAttachDevice;
|
||||||
|
pciResetDevice;
|
||||||
|
-
|
||||||
|
+pciDeviceSetManaged;
|
||||||
|
+pciDeviceGetManaged;
|
||||||
|
+pciDeviceListNew;
|
||||||
|
+pciDeviceListFree;
|
||||||
|
+pciDeviceListAdd;
|
||||||
|
+pciDeviceListDel;
|
||||||
|
|
||||||
|
# qparams.h
|
||||||
|
qparam_get_query;
|
||||||
|
diff --git a/src/pci.c b/src/pci.c
|
||||||
|
index 1dddb08..1e68261 100644
|
||||||
|
--- a/src/pci.c
|
||||||
|
+++ b/src/pci.c
|
||||||
|
@@ -58,6 +58,7 @@ struct _pciDevice {
|
||||||
|
unsigned pci_pm_cap_pos;
|
||||||
|
unsigned has_flr : 1;
|
||||||
|
unsigned has_pm_reset : 1;
|
||||||
|
+ unsigned managed : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* For virReportOOMError() and virReportSystemError() */
|
||||||
|
@@ -220,7 +221,7 @@ pciWrite32(pciDevice *dev, unsigned pos, uint32_t val)
|
||||||
|
pciWrite(dev, pos, &buf[0], sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
-typedef int (*pciIterPredicate)(pciDevice *, pciDevice *);
|
||||||
|
+typedef int (*pciIterPredicate)(pciDevice *, pciDevice *, void *);
|
||||||
|
|
||||||
|
/* Iterate over available PCI devices calling @predicate
|
||||||
|
* to compare each one to @dev.
|
||||||
|
@@ -231,7 +232,8 @@ static int
|
||||||
|
pciIterDevices(virConnectPtr conn,
|
||||||
|
pciIterPredicate predicate,
|
||||||
|
pciDevice *dev,
|
||||||
|
- pciDevice **matched)
|
||||||
|
+ pciDevice **matched,
|
||||||
|
+ void *data)
|
||||||
|
{
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *entry;
|
||||||
|
@@ -249,7 +251,7 @@ pciIterDevices(virConnectPtr conn,
|
||||||
|
|
||||||
|
while ((entry = readdir(dir))) {
|
||||||
|
unsigned domain, bus, slot, function;
|
||||||
|
- pciDevice *try;
|
||||||
|
+ pciDevice *check;
|
||||||
|
|
||||||
|
/* Ignore '.' and '..' */
|
||||||
|
if (entry->d_name[0] == '.')
|
||||||
|
@@ -261,18 +263,18 @@ pciIterDevices(virConnectPtr conn,
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- try = pciGetDevice(conn, domain, bus, slot, function);
|
||||||
|
- if (!try) {
|
||||||
|
+ check = pciGetDevice(conn, domain, bus, slot, function);
|
||||||
|
+ if (!check) {
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (predicate(try, dev)) {
|
||||||
|
- VIR_DEBUG("%s %s: iter matched on %s", dev->id, dev->name, try->name);
|
||||||
|
- *matched = try;
|
||||||
|
+ if (predicate(dev, check, data)) {
|
||||||
|
+ VIR_DEBUG("%s %s: iter matched on %s", dev->id, dev->name, check->name);
|
||||||
|
+ *matched = check;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- pciFreeDevice(conn, try);
|
||||||
|
+ pciFreeDevice(conn, check);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
return ret;
|
||||||
|
@@ -374,63 +376,70 @@ pciDetectPowerManagementReset(pciDevice *dev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Any devices other than the one supplied on the same domain/bus ? */
|
||||||
|
+/* Any active devices other than the one supplied on the same domain/bus ? */
|
||||||
|
static int
|
||||||
|
-pciSharesBus(pciDevice *a, pciDevice *b)
|
||||||
|
+pciSharesBusWithActive(pciDevice *dev, pciDevice *check, void *data)
|
||||||
|
{
|
||||||
|
- return
|
||||||
|
- a->domain == b->domain &&
|
||||||
|
- a->bus == b->bus &&
|
||||||
|
- (a->slot != b->slot ||
|
||||||
|
- a->function != b->function);
|
||||||
|
-}
|
||||||
|
+ pciDeviceList *activeDevs = data;
|
||||||
|
|
||||||
|
-static int
|
||||||
|
-pciBusContainsOtherDevices(virConnectPtr conn, pciDevice *dev)
|
||||||
|
-{
|
||||||
|
- pciDevice *matched = NULL;
|
||||||
|
- if (pciIterDevices(conn, pciSharesBus, dev, &matched) < 0)
|
||||||
|
- return 1;
|
||||||
|
- if (!matched)
|
||||||
|
+ if (dev->domain != check->domain ||
|
||||||
|
+ dev->bus != check->bus ||
|
||||||
|
+ (check->slot == check->slot &&
|
||||||
|
+ check->function == check->function))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (activeDevs && !pciDeviceListFind(activeDevs, check))
|
||||||
|
return 0;
|
||||||
|
- pciFreeDevice(conn, matched);
|
||||||
|
+
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Is @a the parent of @b ? */
|
||||||
|
+static pciDevice *
|
||||||
|
+pciBusContainsActiveDevices(virConnectPtr conn,
|
||||||
|
+ pciDevice *dev,
|
||||||
|
+ pciDeviceList *activeDevs)
|
||||||
|
+{
|
||||||
|
+ pciDevice *active = NULL;
|
||||||
|
+ if (pciIterDevices(conn, pciSharesBusWithActive,
|
||||||
|
+ dev, &active, activeDevs) < 0)
|
||||||
|
+ return NULL;
|
||||||
|
+ return active;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Is @check the parent of @dev ? */
|
||||||
|
static int
|
||||||
|
-pciIsParent(pciDevice *a, pciDevice *b)
|
||||||
|
+pciIsParent(pciDevice *dev, pciDevice *check, void *data ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
uint16_t device_class;
|
||||||
|
uint8_t header_type, secondary, subordinate;
|
||||||
|
|
||||||
|
- if (a->domain != b->domain)
|
||||||
|
+ if (dev->domain != check->domain)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Is it a bridge? */
|
||||||
|
- device_class = pciRead16(a, PCI_CLASS_DEVICE);
|
||||||
|
+ device_class = pciRead16(check, PCI_CLASS_DEVICE);
|
||||||
|
if (device_class != PCI_CLASS_BRIDGE_PCI)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Is it a plane? */
|
||||||
|
- header_type = pciRead8(a, PCI_HEADER_TYPE);
|
||||||
|
+ header_type = pciRead8(check, PCI_HEADER_TYPE);
|
||||||
|
if ((header_type & PCI_HEADER_TYPE_MASK) != PCI_HEADER_TYPE_BRIDGE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- secondary = pciRead8(a, PCI_SECONDARY_BUS);
|
||||||
|
- subordinate = pciRead8(a, PCI_SUBORDINATE_BUS);
|
||||||
|
+ secondary = pciRead8(check, PCI_SECONDARY_BUS);
|
||||||
|
+ subordinate = pciRead8(check, PCI_SUBORDINATE_BUS);
|
||||||
|
|
||||||
|
- VIR_DEBUG("%s %s: found parent device %s\n", b->id, b->name, a->name);
|
||||||
|
+ VIR_DEBUG("%s %s: found parent device %s\n", dev->id, dev->name, check->name);
|
||||||
|
|
||||||
|
/* No, it's superman! */
|
||||||
|
- return (b->bus >= secondary && b->bus <= subordinate);
|
||||||
|
+ return (dev->bus >= secondary && dev->bus <= subordinate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pciDevice *
|
||||||
|
pciGetParentDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
{
|
||||||
|
pciDevice *parent = NULL;
|
||||||
|
- pciIterDevices(conn, pciIsParent, dev, &parent);
|
||||||
|
+ pciIterDevices(conn, pciIsParent, dev, &parent, NULL);
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -438,9 +447,11 @@ pciGetParentDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
* devices behind a bus.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
+pciTrySecondaryBusReset(virConnectPtr conn,
|
||||||
|
+ pciDevice *dev,
|
||||||
|
+ pciDeviceList *activeDevs)
|
||||||
|
{
|
||||||
|
- pciDevice *parent;
|
||||||
|
+ pciDevice *parent, *conflict;
|
||||||
|
uint8_t config_space[PCI_CONF_LEN];
|
||||||
|
uint16_t ctl;
|
||||||
|
int ret = -1;
|
||||||
|
@@ -450,10 +461,10 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
* In future, we could allow it so long as those devices
|
||||||
|
* are not in use by the host or other guests.
|
||||||
|
*/
|
||||||
|
- if (pciBusContainsOtherDevices(conn, dev)) {
|
||||||
|
+ if ((conflict = pciBusContainsActiveDevices(conn, dev, activeDevs))) {
|
||||||
|
pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
- _("Other devices on bus with %s, not doing bus reset"),
|
||||||
|
- dev->name);
|
||||||
|
+ _("Active %s devices on bus with %s, not doing bus reset"),
|
||||||
|
+ conflict->name, dev->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -567,10 +578,18 @@ pciInitDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
-pciResetDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
+pciResetDevice(virConnectPtr conn,
|
||||||
|
+ pciDevice *dev,
|
||||||
|
+ pciDeviceList *activeDevs)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
+ if (activeDevs && pciDeviceListFind(activeDevs, dev)) {
|
||||||
|
+ pciReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ _("Not resetting active device %s"), dev->name);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!dev->initted && pciInitDevice(conn, dev) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
@@ -589,7 +608,7 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
|
||||||
|
/* Bus reset is not an option with the root bus */
|
||||||
|
if (ret < 0 && dev->bus != 0)
|
||||||
|
- ret = pciTrySecondaryBusReset(conn, dev);
|
||||||
|
+ ret = pciTrySecondaryBusReset(conn, dev, activeDevs);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
@@ -885,8 +904,116 @@ pciGetDevice(virConnectPtr conn,
|
||||||
|
void
|
||||||
|
pciFreeDevice(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
|
||||||
|
{
|
||||||
|
+ if (!dev)
|
||||||
|
+ return;
|
||||||
|
VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
|
||||||
|
if (dev->fd >= 0)
|
||||||
|
close(dev->fd);
|
||||||
|
VIR_FREE(dev);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void pciDeviceSetManaged(pciDevice *dev, unsigned managed)
|
||||||
|
+{
|
||||||
|
+ dev->managed = !!managed;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+unsigned pciDeviceGetManaged(pciDevice *dev)
|
||||||
|
+{
|
||||||
|
+ return dev->managed;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+pciDeviceList *
|
||||||
|
+pciDeviceListNew(virConnectPtr conn)
|
||||||
|
+{
|
||||||
|
+ pciDeviceList *list;
|
||||||
|
+
|
||||||
|
+ if (VIR_ALLOC(list) < 0) {
|
||||||
|
+ virReportOOMError(conn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return list;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+pciDeviceListFree(virConnectPtr conn,
|
||||||
|
+ pciDeviceList *list)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (!list)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < list->count; i++) {
|
||||||
|
+ pciFreeDevice(conn, list->devs[i]);
|
||||||
|
+ list->devs[i] = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ list->count = 0;
|
||||||
|
+ VIR_FREE(list->devs);
|
||||||
|
+ VIR_FREE(list);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+pciDeviceListAdd(virConnectPtr conn,
|
||||||
|
+ pciDeviceList *list,
|
||||||
|
+ pciDevice *dev)
|
||||||
|
+{
|
||||||
|
+ if (pciDeviceListFind(list, dev)) {
|
||||||
|
+ pciReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ _("Device %s is already in use"), dev->name);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (VIR_REALLOC_N(list->devs, list->count+1) < 0) {
|
||||||
|
+ virReportOOMError(conn);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ list->devs[list->count++] = dev;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+pciDeviceListDel(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
|
+ pciDeviceList *list,
|
||||||
|
+ pciDevice *dev)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < list->count; i++) {
|
||||||
|
+ if (list->devs[i]->domain != dev->domain ||
|
||||||
|
+ list->devs[i]->bus != dev->bus ||
|
||||||
|
+ list->devs[i]->slot != dev->slot ||
|
||||||
|
+ list->devs[i]->function != dev->function)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ pciFreeDevice(conn, list->devs[i]);
|
||||||
|
+
|
||||||
|
+ if (i != --list->count)
|
||||||
|
+ memmove(&list->devs[i],
|
||||||
|
+ &list->devs[i+1],
|
||||||
|
+ sizeof(*list->devs) * (list->count-i));
|
||||||
|
+
|
||||||
|
+ if (VIR_REALLOC_N(list->devs, list->count) < 0) {
|
||||||
|
+ ; /* not fatal */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+pciDevice *
|
||||||
|
+pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < list->count; i++)
|
||||||
|
+ if (list->devs[i]->domain == dev->domain &&
|
||||||
|
+ list->devs[i]->bus == dev->bus &&
|
||||||
|
+ list->devs[i]->slot == dev->slot &&
|
||||||
|
+ list->devs[i]->function == dev->function)
|
||||||
|
+ return list->devs[i];
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
diff --git a/src/pci.h b/src/pci.h
|
||||||
|
index 47882ef..685b0af 100644
|
||||||
|
--- a/src/pci.h
|
||||||
|
+++ b/src/pci.h
|
||||||
|
@@ -27,6 +27,11 @@
|
||||||
|
|
||||||
|
typedef struct _pciDevice pciDevice;
|
||||||
|
|
||||||
|
+typedef struct {
|
||||||
|
+ unsigned count;
|
||||||
|
+ pciDevice **devs;
|
||||||
|
+} pciDeviceList;
|
||||||
|
+
|
||||||
|
pciDevice *pciGetDevice (virConnectPtr conn,
|
||||||
|
unsigned domain,
|
||||||
|
unsigned bus,
|
||||||
|
@@ -39,6 +44,22 @@ int pciDettachDevice (virConnectPtr conn,
|
||||||
|
int pciReAttachDevice (virConnectPtr conn,
|
||||||
|
pciDevice *dev);
|
||||||
|
int pciResetDevice (virConnectPtr conn,
|
||||||
|
- pciDevice *dev);
|
||||||
|
+ pciDevice *dev,
|
||||||
|
+ pciDeviceList *activeDevs);
|
||||||
|
+void pciDeviceSetManaged(pciDevice *dev,
|
||||||
|
+ unsigned managed);
|
||||||
|
+unsigned pciDeviceGetManaged(pciDevice *dev);
|
||||||
|
+
|
||||||
|
+pciDeviceList *pciDeviceListNew (virConnectPtr conn);
|
||||||
|
+void pciDeviceListFree (virConnectPtr conn,
|
||||||
|
+ pciDeviceList *list);
|
||||||
|
+int pciDeviceListAdd (virConnectPtr conn,
|
||||||
|
+ pciDeviceList *list,
|
||||||
|
+ pciDevice *dev);
|
||||||
|
+void pciDeviceListDel (virConnectPtr conn,
|
||||||
|
+ pciDeviceList *list,
|
||||||
|
+ pciDevice *dev);
|
||||||
|
+pciDevice * pciDeviceListFind (pciDeviceList *list,
|
||||||
|
+ pciDevice *dev);
|
||||||
|
|
||||||
|
#endif /* __VIR_PCI_H__ */
|
||||||
|
diff --git a/src/qemu_conf.h b/src/qemu_conf.h
|
||||||
|
index 70fe9c8..cde326d 100644
|
||||||
|
--- a/src/qemu_conf.h
|
||||||
|
+++ b/src/qemu_conf.h
|
||||||
|
@@ -34,6 +34,7 @@
|
||||||
|
#include "domain_event.h"
|
||||||
|
#include "threads.h"
|
||||||
|
#include "security.h"
|
||||||
|
+#include "pci.h"
|
||||||
|
|
||||||
|
#define qemudDebug(fmt, ...) do {} while(0)
|
||||||
|
|
||||||
|
@@ -90,6 +91,8 @@ struct qemud_driver {
|
||||||
|
|
||||||
|
char *securityDriverName;
|
||||||
|
virSecurityDriverPtr securityDriver;
|
||||||
|
+
|
||||||
|
+ pciDeviceList *activePciHostdevs;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Status needed to reconenct to running VMs */
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index 9f87d2a..7dbf4a2 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -126,6 +126,9 @@ static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
unsigned long newmem);
|
||||||
|
|
||||||
|
+static int qemuUpdateActivePciHostdevs(struct qemud_driver *driver,
|
||||||
|
+ virDomainDefPtr def);
|
||||||
|
+
|
||||||
|
static struct qemud_driver *qemu_driver = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -334,6 +337,10 @@ qemudReconnectVMs(struct qemud_driver *driver)
|
||||||
|
if ((vm->logfile = qemudLogFD(NULL, driver->logDir, vm->def->name)) < 0)
|
||||||
|
goto next_error;
|
||||||
|
|
||||||
|
+ if (qemuUpdateActivePciHostdevs(driver, vm->def) < 0) {
|
||||||
|
+ goto next_error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (vm->def->id >= driver->nextvmid)
|
||||||
|
driver->nextvmid = vm->def->id + 1;
|
||||||
|
|
||||||
|
@@ -515,6 +522,9 @@ qemudStartup(void) {
|
||||||
|
if ((qemu_driver->caps = qemudCapsInit()) == NULL)
|
||||||
|
goto out_of_memory;
|
||||||
|
|
||||||
|
+ if ((qemu_driver->activePciHostdevs = pciDeviceListNew(NULL)) == NULL)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
if (qemudLoadDriverConfig(qemu_driver, driverConf) < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
@@ -627,6 +637,7 @@ qemudShutdown(void) {
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
qemuDriverLock(qemu_driver);
|
||||||
|
+ pciDeviceListFree(NULL, qemu_driver->activePciHostdevs);
|
||||||
|
virCapabilitiesFree(qemu_driver->caps);
|
||||||
|
|
||||||
|
virDomainObjListFree(&qemu_driver->domains);
|
||||||
|
@@ -1209,48 +1220,16 @@ static int qemudNextFreeVNCPort(struct qemud_driver *driver ATTRIBUTE_UNUSED) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int qemuPrepareHostDevices(virConnectPtr conn,
|
||||||
|
- virDomainDefPtr def) {
|
||||||
|
+static pciDeviceList *
|
||||||
|
+qemuGetPciHostDeviceList(virConnectPtr conn,
|
||||||
|
+ virDomainDefPtr def)
|
||||||
|
+{
|
||||||
|
+ pciDeviceList *list;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- /* We have to use 2 loops here. *All* devices must
|
||||||
|
- * be detached before we reset any of them, because
|
||||||
|
- * in some cases you have to reset the whole PCI,
|
||||||
|
- * which impacts all devices on it
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
- virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
-
|
||||||
|
- if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
- continue;
|
||||||
|
- if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- if (hostdev->managed) {
|
||||||
|
- pciDevice *dev = pciGetDevice(conn,
|
||||||
|
- hostdev->source.subsys.u.pci.domain,
|
||||||
|
- hostdev->source.subsys.u.pci.bus,
|
||||||
|
- hostdev->source.subsys.u.pci.slot,
|
||||||
|
- hostdev->source.subsys.u.pci.function);
|
||||||
|
- if (!dev)
|
||||||
|
- goto error;
|
||||||
|
-
|
||||||
|
- if (pciDettachDevice(conn, dev) < 0) {
|
||||||
|
- pciFreeDevice(conn, dev);
|
||||||
|
- goto error;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- pciFreeDevice(conn, dev);
|
||||||
|
- } /* else {
|
||||||
|
- XXX validate that non-managed device isn't in use, eg
|
||||||
|
- by checking that device is either un-bound, or bound
|
||||||
|
- to pci-stub.ko
|
||||||
|
- } */
|
||||||
|
- }
|
||||||
|
+ if (!(list = pciDeviceListNew(conn)))
|
||||||
|
+ return NULL;
|
||||||
|
|
||||||
|
- /* Now that all the PCI hostdevs have be dettached, we can safely
|
||||||
|
- * reset them */
|
||||||
|
for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
pciDevice *dev;
|
||||||
|
@@ -1265,95 +1244,151 @@ static int qemuPrepareHostDevices(virConnectPtr conn,
|
||||||
|
hostdev->source.subsys.u.pci.bus,
|
||||||
|
hostdev->source.subsys.u.pci.slot,
|
||||||
|
hostdev->source.subsys.u.pci.function);
|
||||||
|
- if (!dev)
|
||||||
|
- goto error;
|
||||||
|
+ if (!dev) {
|
||||||
|
+ pciDeviceListFree(conn, list);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (pciResetDevice(conn, dev) < 0) {
|
||||||
|
+ if (pciDeviceListAdd(conn, list, dev) < 0) {
|
||||||
|
pciFreeDevice(conn, dev);
|
||||||
|
- goto error;
|
||||||
|
+ pciDeviceListFree(conn, list);
|
||||||
|
+ return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- pciFreeDevice(conn, dev);
|
||||||
|
+ pciDeviceSetManaged(dev, hostdev->managed);
|
||||||
|
}
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ return list;
|
||||||
|
+}
|
||||||
|
|
||||||
|
-error:
|
||||||
|
- return -1;
|
||||||
|
+static int
|
||||||
|
+qemuUpdateActivePciHostdevs(struct qemud_driver *driver,
|
||||||
|
+ virDomainDefPtr def)
|
||||||
|
+{
|
||||||
|
+ pciDeviceList *pcidevs;
|
||||||
|
+ int i, ret;
|
||||||
|
+
|
||||||
|
+ if (!def->nhostdevs)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (!(pcidevs = qemuGetPciHostDeviceList(NULL, def)))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++) {
|
||||||
|
+ if (pciDeviceListAdd(NULL,
|
||||||
|
+ driver->activePciHostdevs,
|
||||||
|
+ pcidevs->devs[i]) < 0) {
|
||||||
|
+ ret = -1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ pcidevs->devs[i] = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pciDeviceListFree(NULL, pcidevs);
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def)
|
||||||
|
+static int
|
||||||
|
+qemuPrepareHostDevices(virConnectPtr conn,
|
||||||
|
+ struct qemud_driver *driver,
|
||||||
|
+ virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
+ pciDeviceList *pcidevs;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- /* Again 2 loops; reset all the devices before re-attach */
|
||||||
|
+ if (!def->nhostdevs)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
- for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
- virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
- pciDevice *dev;
|
||||||
|
+ if (!(pcidevs = qemuGetPciHostDeviceList(conn, def)))
|
||||||
|
+ return -1;
|
||||||
|
|
||||||
|
- if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
- continue;
|
||||||
|
- if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
- continue;
|
||||||
|
+ /* We have to use 3 loops here. *All* devices must
|
||||||
|
+ * be detached before we reset any of them, because
|
||||||
|
+ * in some cases you have to reset the whole PCI,
|
||||||
|
+ * which impacts all devices on it. Also, all devices
|
||||||
|
+ * must be reset before being marked as active.
|
||||||
|
+ */
|
||||||
|
|
||||||
|
- dev = pciGetDevice(conn,
|
||||||
|
- hostdev->source.subsys.u.pci.domain,
|
||||||
|
- hostdev->source.subsys.u.pci.bus,
|
||||||
|
- hostdev->source.subsys.u.pci.slot,
|
||||||
|
- hostdev->source.subsys.u.pci.function);
|
||||||
|
- if (!dev) {
|
||||||
|
- virErrorPtr err = virGetLastError();
|
||||||
|
- VIR_ERROR(_("Failed to allocate pciDevice: %s\n"),
|
||||||
|
- err ? err->message : "");
|
||||||
|
- virResetError(err);
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
+ /* XXX validate that non-managed device isn't in use, eg
|
||||||
|
+ * by checking that device is either un-bound, or bound
|
||||||
|
+ * to pci-stub.ko
|
||||||
|
+ */
|
||||||
|
|
||||||
|
- if (pciResetDevice(conn, dev) < 0) {
|
||||||
|
- virErrorPtr err = virGetLastError();
|
||||||
|
- VIR_ERROR(_("Failed to reset PCI device: %s\n"),
|
||||||
|
- err ? err->message : "");
|
||||||
|
- virResetError(err);
|
||||||
|
- }
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++)
|
||||||
|
+ if (pciDeviceGetManaged(pcidevs->devs[i]) &&
|
||||||
|
+ pciDettachDevice(conn, pcidevs->devs[i]) < 0)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ /* Now that all the PCI hostdevs have be dettached, we can safely
|
||||||
|
+ * reset them */
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++)
|
||||||
|
+ if (pciResetDevice(conn, pcidevs->devs[i],
|
||||||
|
+ driver->activePciHostdevs) < 0)
|
||||||
|
+ goto error;
|
||||||
|
|
||||||
|
- pciFreeDevice(conn, dev);
|
||||||
|
+ /* Now mark all the devices as active */
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++) {
|
||||||
|
+ if (pciDeviceListAdd(conn,
|
||||||
|
+ driver->activePciHostdevs,
|
||||||
|
+ pcidevs->devs[i]) < 0)
|
||||||
|
+ goto error;
|
||||||
|
+ pcidevs->devs[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
- virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
- pciDevice *dev;
|
||||||
|
+ pciDeviceListFree(conn, pcidevs);
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
- if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
- continue;
|
||||||
|
- if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
- continue;
|
||||||
|
- if (!hostdev->managed)
|
||||||
|
- continue;
|
||||||
|
+error:
|
||||||
|
+ pciDeviceListFree(conn, pcidevs);
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
|
||||||
|
- dev = pciGetDevice(conn,
|
||||||
|
- hostdev->source.subsys.u.pci.domain,
|
||||||
|
- hostdev->source.subsys.u.pci.bus,
|
||||||
|
- hostdev->source.subsys.u.pci.slot,
|
||||||
|
- hostdev->source.subsys.u.pci.function);
|
||||||
|
- if (!dev) {
|
||||||
|
+static void
|
||||||
|
+qemuDomainReAttachHostDevices(virConnectPtr conn,
|
||||||
|
+ struct qemud_driver *driver,
|
||||||
|
+ virDomainDefPtr def)
|
||||||
|
+{
|
||||||
|
+ pciDeviceList *pcidevs;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (!def->nhostdevs)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (!(pcidevs = qemuGetPciHostDeviceList(conn, def))) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
+ VIR_ERROR(_("Failed to allocate pciDeviceList: %s\n"),
|
||||||
|
+ err ? err->message : "");
|
||||||
|
+ virResetError(err);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Again 3 loops; mark all devices as inactive before reset
|
||||||
|
+ * them and reset all the devices before re-attach */
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++)
|
||||||
|
+ pciDeviceListDel(conn, driver->activePciHostdevs, pcidevs->devs[i]);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++)
|
||||||
|
+ if (pciResetDevice(conn, pcidevs->devs[i],
|
||||||
|
+ driver->activePciHostdevs) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
- VIR_ERROR(_("Failed to allocate pciDevice: %s\n"),
|
||||||
|
+ VIR_ERROR(_("Failed to reset PCI device: %s\n"),
|
||||||
|
err ? err->message : "");
|
||||||
|
virResetError(err);
|
||||||
|
- continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (pciReAttachDevice(conn, dev) < 0) {
|
||||||
|
+ for (i = 0; i < pcidevs->count; i++)
|
||||||
|
+ if (pciDeviceGetManaged(pcidevs->devs[i]) &&
|
||||||
|
+ pciReAttachDevice(conn, pcidevs->devs[i]) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
VIR_ERROR(_("Failed to re-attach PCI device: %s\n"),
|
||||||
|
err ? err->message : "");
|
||||||
|
virResetError(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
- pciFreeDevice(conn, dev);
|
||||||
|
- }
|
||||||
|
+ pciDeviceListFree(conn, pcidevs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qemudDomainSetSecurityLabel(virConnectPtr conn, struct qemud_driver *driver, virDomainObjPtr vm)
|
||||||
|
@@ -1468,7 +1503,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
||||||
|
&qemuCmdFlags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
- if (qemuPrepareHostDevices(conn, vm->def) < 0)
|
||||||
|
+ if (qemuPrepareHostDevices(conn, driver, vm->def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
vm->def->id = driver->nextvmid++;
|
||||||
|
@@ -1634,7 +1669,7 @@ static void qemudShutdownVMDaemon(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
|
VIR_FREE(vm->def->seclabel.imagelabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
- qemuDomainReAttachHostDevices(conn, vm->def);
|
||||||
|
+ qemuDomainReAttachHostDevices(conn, driver, vm->def);
|
||||||
|
|
||||||
|
if (qemudRemoveDomainStatus(conn, driver, vm) < 0) {
|
||||||
|
VIR_WARN(_("Failed to remove domain status for %s"),
|
||||||
|
@@ -5247,6 +5282,7 @@ out:
|
||||||
|
static int
|
||||||
|
qemudNodeDeviceReset (virNodeDevicePtr dev)
|
||||||
|
{
|
||||||
|
+ struct qemud_driver *driver = dev->conn->privateData;
|
||||||
|
pciDevice *pci;
|
||||||
|
unsigned domain, bus, slot, function;
|
||||||
|
int ret = -1;
|
||||||
|
@@ -5258,11 +5294,14 @@ qemudNodeDeviceReset (virNodeDevicePtr dev)
|
||||||
|
if (!pci)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- if (pciResetDevice(dev->conn, pci) < 0)
|
||||||
|
+ qemuDriverLock(driver);
|
||||||
|
+
|
||||||
|
+ if (pciResetDevice(dev->conn, pci, driver->activePciHostdevs) < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
out:
|
||||||
|
+ qemuDriverUnlock(driver);
|
||||||
|
pciFreeDevice(dev->conn, pci);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
diff --git a/src/xen_unified.c b/src/xen_unified.c
|
||||||
|
index e708980..ba8c769 100644
|
||||||
|
--- a/src/xen_unified.c
|
||||||
|
+++ b/src/xen_unified.c
|
||||||
|
@@ -1529,7 +1529,7 @@ xenUnifiedNodeDeviceReset (virNodeDevicePtr dev)
|
||||||
|
if (!pci)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- if (pciResetDevice(dev->conn, pci) < 0)
|
||||||
|
+ if (pciResetDevice(dev->conn, pci, NULL) < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
121
libvirt-allow-pm-reset-on-multi-function-pci-devices.patch
Normal file
121
libvirt-allow-pm-reset-on-multi-function-pci-devices.patch
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
From d79f35fbd4eaf610972621b042993d00f3247d5c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 14 Aug 2009 08:31:11 +0100
|
||||||
|
Subject: [PATCH] Allow PM reset on multi-function PCI devices
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/515689
|
||||||
|
|
||||||
|
It turns out that a PCI Power Management reset only affects individual
|
||||||
|
functions, and not the whole device.
|
||||||
|
|
||||||
|
The PCI Power Management spec talks about resetting the 'device' rather
|
||||||
|
than the 'function', but Intel's Dexuan Cui informs me that it is
|
||||||
|
actually a per-function reset.
|
||||||
|
|
||||||
|
Also, Yu Zhao has added pci_pm_reset() to the kernel, and it doesn't
|
||||||
|
reject multi-function devices, so it must be true! :-)
|
||||||
|
|
||||||
|
(A side issue is that we could defer the PM reset to the kernel if we
|
||||||
|
could detect that the kernel has PM reset support, but barring version
|
||||||
|
number checks we don't have a way to detect that support)
|
||||||
|
|
||||||
|
* src/pci.c: remove the pciDeviceContainsOtherFunctions() check from
|
||||||
|
pciTryPowerManagementReset() and prefer PM reset over bus reset
|
||||||
|
where both are available
|
||||||
|
|
||||||
|
Cc: Cui, Dexuan <dexuan.cui@intel.com>
|
||||||
|
Cc: Yu Zhao <yu.zhao@intel.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 64a6682b93a2a8aa38067a43979c9eaf993d2b41)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-allow-pm-reset-on-multi-function-pci-devices.patch
|
||||||
|
---
|
||||||
|
src/pci.c | 48 +++++++++---------------------------------------
|
||||||
|
1 files changed, 9 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/pci.c b/src/pci.c
|
||||||
|
index 68a380d..f78ab9f 100644
|
||||||
|
--- a/src/pci.c
|
||||||
|
+++ b/src/pci.c
|
||||||
|
@@ -397,29 +397,6 @@ pciBusContainsOtherDevices(virConnectPtr conn, pciDevice *dev)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Any other functions on this device ? */
|
||||||
|
-static int
|
||||||
|
-pciSharesDevice(pciDevice *a, pciDevice *b)
|
||||||
|
-{
|
||||||
|
- return
|
||||||
|
- a->domain == b->domain &&
|
||||||
|
- a->bus == b->bus &&
|
||||||
|
- a->slot == b->slot &&
|
||||||
|
- a->function != b->function;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int
|
||||||
|
-pciDeviceContainsOtherFunctions(virConnectPtr conn, pciDevice *dev)
|
||||||
|
-{
|
||||||
|
- pciDevice *matched = NULL;
|
||||||
|
- if (pciIterDevices(conn, pciSharesDevice, dev, &matched) < 0)
|
||||||
|
- return 1;
|
||||||
|
- if (!matched)
|
||||||
|
- return 0;
|
||||||
|
- pciFreeDevice(conn, matched);
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
/* Is @a the parent of @b ? */
|
||||||
|
static int
|
||||||
|
pciIsParent(pciDevice *a, pciDevice *b)
|
||||||
|
@@ -524,7 +501,7 @@ out:
|
||||||
|
* above we require the device supports a full internal reset.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-pciTryPowerManagementReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
+pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
|
||||||
|
{
|
||||||
|
uint8_t config_space[PCI_CONF_LEN];
|
||||||
|
uint32_t ctl;
|
||||||
|
@@ -532,16 +509,6 @@ pciTryPowerManagementReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
if (!dev->pci_pm_cap_pos)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- /* For now, we just refuse to do a power management reset
|
||||||
|
- * if there are other functions on this device.
|
||||||
|
- * In future, we could allow it so long as those functions
|
||||||
|
- * are not in use by the host or other guests.
|
||||||
|
- */
|
||||||
|
- if (pciDeviceContainsOtherFunctions(conn, dev)) {
|
||||||
|
- VIR_WARN("%s contains other functions, not resetting", dev->name);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Save and restore the device's config space. */
|
||||||
|
if (pciRead(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
|
||||||
|
VIR_WARN("Failed to save PCI config space for %s", dev->name);
|
||||||
|
@@ -599,14 +566,17 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
if (dev->has_flr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ /* If the device supports PCI power management reset,
|
||||||
|
+ * that's the next best thing because it only resets
|
||||||
|
+ * the function, not the whole device.
|
||||||
|
+ */
|
||||||
|
+ if (dev->has_pm_reset)
|
||||||
|
+ ret = pciTryPowerManagementReset(conn, dev);
|
||||||
|
+
|
||||||
|
/* Bus reset is not an option with the root bus */
|
||||||
|
- if (dev->bus != 0)
|
||||||
|
+ if (ret < 0 && dev->bus != 0)
|
||||||
|
ret = pciTrySecondaryBusReset(conn, dev);
|
||||||
|
|
||||||
|
- /* Next best option is a PCI power management reset */
|
||||||
|
- if (ret < 0 && dev->has_pm_reset)
|
||||||
|
- ret = pciTryPowerManagementReset(conn, dev);
|
||||||
|
-
|
||||||
|
if (ret < 0)
|
||||||
|
pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
_("No PCI reset capability available for %s"),
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
31
libvirt-do-not-overwrite-error-in-wait-for-monitor.patch
Normal file
31
libvirt-do-not-overwrite-error-in-wait-for-monitor.patch
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
From 1319852c443c432d44a2e73508f3be742027f780 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Wed, 19 Aug 2009 11:28:02 +0100
|
||||||
|
Subject: [PATCH] Don't overwrite error in qemudWaitForMonitor()
|
||||||
|
|
||||||
|
May help diagnose https://bugzilla.redhat.com/515054
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-do-not-overwrite-error-in-wait-for-monitor.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 5 +++--
|
||||||
|
1 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index dfd19c5..74e106a 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -985,8 +985,9 @@ static int qemudWaitForMonitor(virConnectPtr conn,
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Unexpected end of file - inform user of QEMU log data */
|
||||||
|
- qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
- _("unable to start guest: %s"), buf);
|
||||||
|
+ if (!virGetLastError())
|
||||||
|
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ _("unable to start guest: %s"), buf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
53
libvirt-fix-device-list-update-after-detach.patch
Normal file
53
libvirt-fix-device-list-update-after-detach.patch
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
From 2754da03d65f216271c81ece791b96a19272c812 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Sat, 15 Aug 2009 19:38:15 +0100
|
||||||
|
Subject: [PATCH] Fix list updating after disk hot-unplug
|
||||||
|
|
||||||
|
The current code makes a poor effort at updating the device arrays after
|
||||||
|
hot-unplug. Fix that and combine the two code paths into one.
|
||||||
|
|
||||||
|
* src/qemu_driver.c: fix list updating in qemudDomainDetachPciDiskDevice()
|
||||||
|
|
||||||
|
(cherry picked from commit 4e12af5623e4a962a6bb911af06fa29aa85befba)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-fix-device-list-update-after-detach.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 21 ++++++++++-----------
|
||||||
|
1 files changed, 10 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index dfd19c5..ce04beb 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -4123,18 +4123,17 @@ try_command:
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (vm->def->ndisks > 1) {
|
||||||
|
- vm->def->disks[i] = vm->def->disks[--vm->def->ndisks];
|
||||||
|
- if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks) < 0) {
|
||||||
|
- virReportOOMError(conn);
|
||||||
|
- goto cleanup;
|
||||||
|
- }
|
||||||
|
- qsort(vm->def->disks, vm->def->ndisks, sizeof(*vm->def->disks),
|
||||||
|
- virDomainDiskQSort);
|
||||||
|
- } else {
|
||||||
|
- VIR_FREE(vm->def->disks[0]);
|
||||||
|
- vm->def->ndisks = 0;
|
||||||
|
+ if (i != --vm->def->ndisks)
|
||||||
|
+ memmove(&vm->def->disks[i],
|
||||||
|
+ &vm->def->disks[i+1],
|
||||||
|
+ sizeof(*vm->def->disks) * (vm->def->ndisks-i));
|
||||||
|
+ if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks) < 0) {
|
||||||
|
+ virReportOOMError(conn);
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
+ qsort(vm->def->disks, vm->def->ndisks, sizeof(*vm->def->disks),
|
||||||
|
+ virDomainDiskQSort);
|
||||||
|
+
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
141
libvirt-improve-pci-hostdev-reset-error-message.patch
Normal file
141
libvirt-improve-pci-hostdev-reset-error-message.patch
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
From 9f80bab3829b97ac2802c15b9f3e4a6bbbb24627 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 14 Aug 2009 08:31:11 +0100
|
||||||
|
Subject: [PATCH] Improve PCI host device reset error message
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/499678
|
||||||
|
|
||||||
|
Currently, if we are unable to reset a PCI device we return a fairly
|
||||||
|
generic 'No PCI reset capability available' error message.
|
||||||
|
|
||||||
|
Fix that by returning an error from the individual reset messages and
|
||||||
|
using that error to construct the higher level error mesage.
|
||||||
|
|
||||||
|
* src/pci.c: set errors in pciTryPowerManagementReset() and
|
||||||
|
pciTrySecondaryBusReset() on failure; use those error messages
|
||||||
|
in pciResetDevice(), or explain that no reset support is available
|
||||||
|
|
||||||
|
(cherry picked from commit ebea34185612c3b96d7d3bbd8b7c2ce6c9f4fe6f)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-improve-pci-hostdev-reset-error-message.patch
|
||||||
|
---
|
||||||
|
src/pci.c | 44 +++++++++++++++++++++++++++++++-------------
|
||||||
|
src/qemu_driver.c | 4 ++--
|
||||||
|
2 files changed, 33 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/pci.c b/src/pci.c
|
||||||
|
index f78ab9f..1dddb08 100644
|
||||||
|
--- a/src/pci.c
|
||||||
|
+++ b/src/pci.c
|
||||||
|
@@ -451,15 +451,18 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
* are not in use by the host or other guests.
|
||||||
|
*/
|
||||||
|
if (pciBusContainsOtherDevices(conn, dev)) {
|
||||||
|
- VIR_WARN("Other devices on bus with %s, not doing bus reset",
|
||||||
|
- dev->name);
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Other devices on bus with %s, not doing bus reset"),
|
||||||
|
+ dev->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the parent bus */
|
||||||
|
parent = pciGetParentDevice(conn, dev);
|
||||||
|
if (!parent) {
|
||||||
|
- VIR_WARN("Failed to find parent device for %s", dev->name);
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Failed to find parent device for %s"),
|
||||||
|
+ dev->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -470,7 +473,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
* are multiple devices/functions
|
||||||
|
*/
|
||||||
|
if (pciRead(dev, 0, config_space, PCI_CONF_LEN) < 0) {
|
||||||
|
- VIR_WARN("Failed to save PCI config space for %s", dev->name);
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Failed to save PCI config space for %s"),
|
||||||
|
+ dev->name);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -487,9 +492,12 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
|
||||||
|
|
||||||
|
usleep(200 * 1000); /* sleep 200ms */
|
||||||
|
|
||||||
|
- if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0)
|
||||||
|
- VIR_WARN("Failed to restore PCI config space for %s", dev->name);
|
||||||
|
-
|
||||||
|
+ if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0) {
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Failed to restore PCI config space for %s"),
|
||||||
|
+ dev->name);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
ret = 0;
|
||||||
|
out:
|
||||||
|
pciFreeDevice(conn, parent);
|
||||||
|
@@ -511,7 +519,9 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
|
||||||
|
|
||||||
|
/* Save and restore the device's config space. */
|
||||||
|
if (pciRead(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
|
||||||
|
- VIR_WARN("Failed to save PCI config space for %s", dev->name);
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Failed to save PCI config space for %s"),
|
||||||
|
+ dev->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -528,8 +538,12 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
|
||||||
|
|
||||||
|
usleep(10 * 1000); /* sleep 10ms */
|
||||||
|
|
||||||
|
- if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0)
|
||||||
|
- VIR_WARN("Failed to restore PCI config space for %s", dev->name);
|
||||||
|
+ if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
|
||||||
|
+ pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
+ _("Failed to restore PCI config space for %s"),
|
||||||
|
+ dev->name);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -577,10 +591,14 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev)
|
||||||
|
if (ret < 0 && dev->bus != 0)
|
||||||
|
ret = pciTrySecondaryBusReset(conn, dev);
|
||||||
|
|
||||||
|
- if (ret < 0)
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
pciReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||||
|
- _("No PCI reset capability available for %s"),
|
||||||
|
- dev->name);
|
||||||
|
+ _("Unable to reset PCI device %s: %s"),
|
||||||
|
+ dev->name,
|
||||||
|
+ err ? err->message : _("no FLR, PM reset or bus reset available"));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index ddd3693..9f87d2a 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1345,9 +1345,9 @@ qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (pciDettachDevice(conn, dev) < 0) {
|
||||||
|
+ if (pciReAttachDevice(conn, dev) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
- VIR_ERROR(_("Failed to reset PCI device: %s\n"),
|
||||||
|
+ VIR_ERROR(_("Failed to re-attach PCI device: %s\n"),
|
||||||
|
err ? err->message : "");
|
||||||
|
virResetError(err);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
124
libvirt-reattach-pci-hostdevs-after-guest-shutdown.patch
Normal file
124
libvirt-reattach-pci-hostdevs-after-guest-shutdown.patch
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
From 1e44604c0d4c2d4c1347c2a1027f1ea02a6499f9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||||||
|
Date: Fri, 14 Aug 2009 08:31:11 +0100
|
||||||
|
Subject: [PATCH] Reset and re-attach PCI host devices on guest shutdown
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/499561
|
||||||
|
|
||||||
|
When the guest shuts down, we should attempt to restore all PCI host
|
||||||
|
devices to a sane state.
|
||||||
|
|
||||||
|
In the case of managed hostdevs, we should reset and re-attach the
|
||||||
|
devices. In the case of unmanaged hostdevs, we should just reset them.
|
||||||
|
|
||||||
|
Note, KVM will already reset assigned devices when the guest shuts
|
||||||
|
down using whatever means it can, so we are only doing it to cover the
|
||||||
|
cases the kernel can't handle.
|
||||||
|
|
||||||
|
* src/qemu_driver.c: add qemuDomainReAttachHostDevices() and call
|
||||||
|
it from qemudShutdownVMDaemon()
|
||||||
|
|
||||||
|
(cherry picked from commit 4035152a8767e72fd4e26a91cb4d5afa75b72e61)
|
||||||
|
|
||||||
|
Fedora-patch: libvirt-reattach-pci-hostdevs-after-guest-shutdown.patch
|
||||||
|
---
|
||||||
|
src/qemu_driver.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
1 files changed, 76 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
|
||||||
|
index ce04beb..ddd3693 100644
|
||||||
|
--- a/src/qemu_driver.c
|
||||||
|
+++ b/src/qemu_driver.c
|
||||||
|
@@ -1282,6 +1282,80 @@ error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ /* Again 2 loops; reset all the devices before re-attach */
|
||||||
|
+
|
||||||
|
+ for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
+ virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
+ pciDevice *dev;
|
||||||
|
+
|
||||||
|
+ if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
+ continue;
|
||||||
|
+ if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ dev = pciGetDevice(conn,
|
||||||
|
+ hostdev->source.subsys.u.pci.domain,
|
||||||
|
+ hostdev->source.subsys.u.pci.bus,
|
||||||
|
+ hostdev->source.subsys.u.pci.slot,
|
||||||
|
+ hostdev->source.subsys.u.pci.function);
|
||||||
|
+ if (!dev) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
+ VIR_ERROR(_("Failed to allocate pciDevice: %s\n"),
|
||||||
|
+ err ? err->message : "");
|
||||||
|
+ virResetError(err);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (pciResetDevice(conn, dev) < 0) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
+ VIR_ERROR(_("Failed to reset PCI device: %s\n"),
|
||||||
|
+ err ? err->message : "");
|
||||||
|
+ virResetError(err);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pciFreeDevice(conn, dev);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0 ; i < def->nhostdevs ; i++) {
|
||||||
|
+ virDomainHostdevDefPtr hostdev = def->hostdevs[i];
|
||||||
|
+ pciDevice *dev;
|
||||||
|
+
|
||||||
|
+ if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
+ continue;
|
||||||
|
+ if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
+ continue;
|
||||||
|
+ if (!hostdev->managed)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ dev = pciGetDevice(conn,
|
||||||
|
+ hostdev->source.subsys.u.pci.domain,
|
||||||
|
+ hostdev->source.subsys.u.pci.bus,
|
||||||
|
+ hostdev->source.subsys.u.pci.slot,
|
||||||
|
+ hostdev->source.subsys.u.pci.function);
|
||||||
|
+ if (!dev) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
+ VIR_ERROR(_("Failed to allocate pciDevice: %s\n"),
|
||||||
|
+ err ? err->message : "");
|
||||||
|
+ virResetError(err);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (pciDettachDevice(conn, dev) < 0) {
|
||||||
|
+ virErrorPtr err = virGetLastError();
|
||||||
|
+ VIR_ERROR(_("Failed to reset PCI device: %s\n"),
|
||||||
|
+ err ? err->message : "");
|
||||||
|
+ virResetError(err);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pciFreeDevice(conn, dev);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int qemudDomainSetSecurityLabel(virConnectPtr conn, struct qemud_driver *driver, virDomainObjPtr vm)
|
||||||
|
{
|
||||||
|
if (vm->def->seclabel.label != NULL)
|
||||||
|
@@ -1560,6 +1634,8 @@ static void qemudShutdownVMDaemon(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
|
VIR_FREE(vm->def->seclabel.imagelabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ qemuDomainReAttachHostDevices(conn, vm->def);
|
||||||
|
+
|
||||||
|
if (qemudRemoveDomainStatus(conn, driver, vm) < 0) {
|
||||||
|
VIR_WARN(_("Failed to remove domain status for %s"),
|
||||||
|
vm->def->name);
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
766
libvirt.spec
766
libvirt.spec
@@ -1,105 +1,435 @@
|
|||||||
# -*- rpm-spec -*-
|
# -*- rpm-spec -*-
|
||||||
|
|
||||||
|
%define with_xen 0%{!?_without_xen:1}
|
||||||
|
%define with_xen_proxy 0%{!?_without_xen_proxy:1}
|
||||||
|
%define with_qemu 0%{!?_without_qemu:1}
|
||||||
|
%define with_openvz 0%{!?_without_openvz:1}
|
||||||
|
%define with_lxc 0%{!?_without_lxc:1}
|
||||||
|
%define with_sasl 0%{!?_without_sasl:1}
|
||||||
|
%define with_avahi 0%{!?_without_avahi:1}
|
||||||
|
%define with_polkit 0%{!?_without_polkit:0}
|
||||||
|
%define with_python 0%{!?_without_python:1}
|
||||||
|
%define with_libvirtd 0%{!?_without_libvirtd:1}
|
||||||
|
%define with_uml 0%{!?_without_uml:1}
|
||||||
|
%define with_network 0%{!?_without_network:1}
|
||||||
|
|
||||||
|
%define with_xen 0%{!?_without_xen:1}
|
||||||
|
%define with_xen_proxy 0%{!?_without_xen_proxy:1}
|
||||||
|
%define with_qemu 0%{!?_without_qemu:1}
|
||||||
|
%define with_openvz 0%{!?_without_openvz:1}
|
||||||
|
%define with_lxc 0%{!?_without_lxc:1}
|
||||||
|
%define with_sasl 0%{!?_without_sasl:1}
|
||||||
|
%define with_avahi 0%{!?_without_avahi:1}
|
||||||
|
%define with_polkit 0%{!?_without_polkit:0}
|
||||||
|
%define with_python 0%{!?_without_python:1}
|
||||||
|
%define with_libvirtd 0%{!?_without_libvirtd:1}
|
||||||
|
%define with_uml 0%{!?_without_uml:1}
|
||||||
|
%define with_network 0%{!?_without_network:1}
|
||||||
|
%define with_storage_fs 0%{!?_without_storage_fs:1}
|
||||||
|
%define with_storage_lvm 0%{!?_without_storage_lvm:1}
|
||||||
|
%define with_storage_iscsi 0%{!?_without_storage_iscsi:1}
|
||||||
|
%define with_storage_disk 0%{!?_without_storage_disk:1}
|
||||||
|
%define with_numactl 0%{!?_without_numactl:1}
|
||||||
|
|
||||||
|
|
||||||
|
# Xen is available only on i386 x86_64 ia64
|
||||||
|
%ifnarch i386 i586 i686 x86_64 ia64
|
||||||
|
%define with_xen 0
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_xen}
|
||||||
|
%define with_xen_proxy 0
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%ifarch ppc64
|
||||||
|
%define with_qemu 0
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora} >= 8
|
||||||
|
%define with_polkit 0%{!?_without_polkit:1}
|
||||||
|
%define with_xen_proxy 0
|
||||||
|
%endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# If building on RHEL switch on the specific support
|
||||||
|
# for the specific Xen version
|
||||||
|
#
|
||||||
|
%if 0%{?fedora}
|
||||||
|
%define with_rhel5 0
|
||||||
|
%else
|
||||||
|
%define with_rhel5 1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
Summary: Library providing a simple API virtualization
|
Summary: Library providing a simple API virtualization
|
||||||
Name: libvirt
|
Name: libvirt
|
||||||
Version: 0.3.3
|
Version: 0.6.2
|
||||||
Release: 2%{?dist}%{?extra_release}
|
Release: 16%{?dist}%{?extra_release}
|
||||||
License: LGPL
|
License: LGPLv2+
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Source: libvirt-%{version}.tar.gz
|
Source: libvirt-%{version}.tar.gz
|
||||||
Patch1: %{name}-%{version}-qemu-config.patch
|
|
||||||
# NB, when removing this patch on next release, also remove the manual
|
# Patches cherry-picked from upstream
|
||||||
# config file copy in the install section of this spec file
|
Patch0: libvirt-0.6.2-qemu-drive-format.patch
|
||||||
Patch2: %{name}-%{version}-example-config.patch
|
# Fix shared/readonly disk labelling
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
Patch1: libvirt-0.6.2-shared-readonly-label.patch
|
||||||
|
# Fix <hostdev managed='yes'>
|
||||||
|
Patch2: libvirt-0.6.3-hostdev-managed.patch
|
||||||
|
# Refresh qemu caps when getCapabilities is called (bz 460649)
|
||||||
|
Patch3: libvirt-0.6.3-refresh-qemu-caps.patch
|
||||||
|
# Enable migration with qemu 0.10
|
||||||
|
Patch4: libvirt-0.6.2-enable-qemu-0-10-migration.patch
|
||||||
|
# Don't try to label a disk with no path (e.g. empty cdrom) (bz 499569)
|
||||||
|
Patch5: libvirt-0.6.2-fix-nosource-label.patch
|
||||||
|
# Fix qemu argv detection with latest qemu (bz 501923)
|
||||||
|
Patch6: libvirt-0.6.2-fix-qemu-argv-detection-with-kvm-85.patch
|
||||||
|
# Fix XML attribute escaping (bz 499791)
|
||||||
|
Patch7: libvirt-0.6.2-xml-attribute-escaping.patch
|
||||||
|
# Fix serious event handling issues causing guests to be destroyed (bz 499698)
|
||||||
|
Patch8: libvirt-0.6.2-event-handling-1.patch
|
||||||
|
Patch9: libvirt-0.6.2-event-handling-2.patch
|
||||||
|
# Don't log monitor output to domain log file (bz 499584)
|
||||||
|
Patch10: libvirt-0.6.2-do-not-log-monitor-output.patch
|
||||||
|
# Bring up the bridge, even if it doesn't have an IP address (bz 501912)
|
||||||
|
Patch11: libvirt-0.6.2-bring-up-ipless-bridge.patch
|
||||||
|
# Use the correct QEMU machine type for ppc (bz 502862)
|
||||||
|
Patch12: libvirt-0.6.2-qemu-ppc-machine-type.patch
|
||||||
|
# Fix crash with TLS connections (bz 503066)
|
||||||
|
Patch13: libvirt-0.6.2-libvirtd-double-free.patch
|
||||||
|
# Fix broken networking with newer qemu releases (bz 503275)
|
||||||
|
Patch14: libvirt-0.6.2-avoid-broken-networking-with-newer-qemu.patch
|
||||||
|
# Fix libvirtd crash with bad capabilities data (bz 505635)
|
||||||
|
Patch15: libvirt-0.6.2-fix-libvirtd-crash-with-bad-capabilities-data.patch
|
||||||
|
# Don't unnecessarily try to change a file context (bug #507555)
|
||||||
|
Patch16: libvirt-0.6.2-do-not-unnecessarily-try-to-change-a-file-context.patch
|
||||||
|
# Misc useful fix
|
||||||
|
Patch17: libvirt-0.6.2-monitor-prompt-discard.patch
|
||||||
|
# rhbz #496442
|
||||||
|
Patch18: libvirt-0.6.2-hotplug-labelling.patch
|
||||||
|
# rhbz 499669
|
||||||
|
Patch19: libvirt-0.6.2-hotplug-monitor-syntax.patch
|
||||||
|
# rhbz #510907
|
||||||
|
Patch20: libvirt-0.6.2-pci-device-crash.patch
|
||||||
|
# rhbz #507405
|
||||||
|
Patch21: libvirt-0.6.2-qemu-name-uniqueness.patch
|
||||||
|
# rhbz #479517
|
||||||
|
Patch22: libvirt-0.6.2-buf-locale-escape.patch
|
||||||
|
# rhbz #506590
|
||||||
|
Patch23: libvirt-0.6.2-numa-ignore-fail.patch
|
||||||
|
# Minor 'virsh nodedev-list --tree' annoyance, fix from upstream
|
||||||
|
Patch24: libvirt-add-space-to-nodedev-list-tree.patch
|
||||||
|
# Fixes list corruption after disk hot-unplug
|
||||||
|
Patch25: libvirt-fix-device-list-update-after-detach.patch
|
||||||
|
# Re-attach PCI host devices after guest shuts down (bug #499561)
|
||||||
|
Patch26: libvirt-reattach-pci-hostdevs-after-guest-shutdown.patch
|
||||||
|
# Allow PM reset on multi-function PCI devices (bug #515689)
|
||||||
|
Patch27: libvirt-allow-pm-reset-on-multi-function-pci-devices.patch
|
||||||
|
# Fix stupid PCI reset error message (#499678)
|
||||||
|
Patch28: libvirt-improve-pci-hostdev-reset-error-message.patch
|
||||||
|
# Allow PCI bus reset to reset other devices (#499678)
|
||||||
|
Patch29: libvirt-allow-pci-hostdev-reset-to-reset-other-devices.patch
|
||||||
|
|
||||||
|
# Not for upstream. Temporary hack till PulseAudio autostart
|
||||||
|
# problems are sorted out when SELinux enforcing
|
||||||
|
Patch200: libvirt-0.6.2-svirt-sound.patch
|
||||||
|
|
||||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||||
URL: http://libvirt.org/
|
URL: http://libvirt.org/
|
||||||
BuildRequires: python python-devel
|
BuildRequires: python python-devel
|
||||||
Requires: libxml2
|
|
||||||
Requires: readline
|
Requires: readline
|
||||||
Requires: ncurses
|
Requires: ncurses
|
||||||
Requires: dnsmasq
|
Requires: dnsmasq
|
||||||
Requires: bridge-utils
|
Requires: bridge-utils
|
||||||
Requires: iptables
|
Requires: iptables
|
||||||
|
# needed for device enumeration
|
||||||
%ifarch i386 x86_64 ia64
|
Requires: hal
|
||||||
|
# So remote clients can access libvirt over SSH tunnel
|
||||||
|
# (client invokes 'nc' against the UNIX socket on the server)
|
||||||
|
Requires: nc
|
||||||
|
%if %{with_sasl}
|
||||||
|
Requires: cyrus-sasl
|
||||||
|
# Not technically required, but makes 'out-of-box' config
|
||||||
|
# work correctly & doesn't have onerous dependencies
|
||||||
|
Requires: cyrus-sasl-md5
|
||||||
|
%endif
|
||||||
|
%if %{with_polkit}
|
||||||
|
Requires: PolicyKit >= 0.6
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_fs}
|
||||||
|
# For mount/umount in FS driver
|
||||||
|
BuildRequires: util-linux
|
||||||
|
# For showmount in FS driver (netfs discovery)
|
||||||
|
BuildRequires: nfs-utils
|
||||||
|
Requires: nfs-utils
|
||||||
|
%endif
|
||||||
|
%if %{with_qemu}
|
||||||
|
# From QEMU RPMs
|
||||||
|
Requires: /usr/bin/qemu-img
|
||||||
|
%else
|
||||||
|
%if %{with_xen}
|
||||||
|
# From Xen RPMs
|
||||||
|
Requires: /usr/sbin/qcow-create
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_lvm}
|
||||||
|
# For LVM drivers
|
||||||
|
Requires: lvm2
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_iscsi}
|
||||||
|
# For ISCSI driver
|
||||||
|
Requires: iscsi-initiator-utils
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_disk}
|
||||||
|
# For disk driver
|
||||||
|
Requires: parted
|
||||||
|
%endif
|
||||||
|
# For svirt support
|
||||||
|
Requires: libselinux
|
||||||
|
%if %{with_xen}
|
||||||
BuildRequires: xen-devel
|
BuildRequires: xen-devel
|
||||||
%endif
|
%endif
|
||||||
BuildRequires: libxml2-devel
|
BuildRequires: libxml2-devel
|
||||||
|
BuildRequires: xhtml1-dtds
|
||||||
BuildRequires: readline-devel
|
BuildRequires: readline-devel
|
||||||
BuildRequires: ncurses-devel
|
BuildRequires: ncurses-devel
|
||||||
BuildRequires: gettext
|
BuildRequires: gettext
|
||||||
BuildRequires: gnutls-devel
|
BuildRequires: gnutls-devel
|
||||||
|
BuildRequires: hal-devel
|
||||||
|
%if %{with_avahi}
|
||||||
BuildRequires: avahi-devel
|
BuildRequires: avahi-devel
|
||||||
|
%endif
|
||||||
|
BuildRequires: libselinux-devel
|
||||||
BuildRequires: dnsmasq
|
BuildRequires: dnsmasq
|
||||||
BuildRequires: bridge-utils
|
BuildRequires: bridge-utils
|
||||||
Obsoletes: libvir
|
%if %{with_sasl}
|
||||||
|
BuildRequires: cyrus-sasl-devel
|
||||||
|
%endif
|
||||||
|
%if %{with_polkit}
|
||||||
|
BuildRequires: PolicyKit-devel >= 0.6
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_fs}
|
||||||
|
# For mount/umount in FS driver
|
||||||
|
BuildRequires: util-linux
|
||||||
|
%endif
|
||||||
|
%if %{with_qemu}
|
||||||
|
# From QEMU RPMs
|
||||||
|
BuildRequires: /usr/bin/qemu-img
|
||||||
|
%else
|
||||||
|
%if %{with_xen}
|
||||||
|
# From Xen RPMs
|
||||||
|
BuildRequires: /usr/sbin/qcow-create
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_lvm}
|
||||||
|
# For LVM drivers
|
||||||
|
BuildRequires: lvm2
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_iscsi}
|
||||||
|
# For ISCSI driver
|
||||||
|
BuildRequires: iscsi-initiator-utils
|
||||||
|
%endif
|
||||||
|
%if %{with_storage_disk}
|
||||||
|
# For disk driver
|
||||||
|
BuildRequires: parted-devel
|
||||||
|
%endif
|
||||||
|
%if %{with_numactl}
|
||||||
|
# For QEMU/LXC numa info
|
||||||
|
BuildRequires: numactl-devel
|
||||||
|
%endif
|
||||||
|
Obsoletes: libvir <= 0.2
|
||||||
|
Provides: libvir = %{version}-%{release}
|
||||||
|
|
||||||
# Fedora build root suckage
|
# Fedora build root suckage
|
||||||
BuildRequires: gawk
|
BuildRequires: gawk
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Libvirt is a C toolkit to interract with the virtualization capabilities
|
Libvirt is a C toolkit to interact with the virtualization capabilities
|
||||||
of recent versions of Linux (and other OSes).
|
of recent versions of Linux (and other OSes).
|
||||||
|
|
||||||
%package devel
|
%package devel
|
||||||
Summary: Libraries, includes, etc. to compile with the libvirt library
|
Summary: Libraries, includes, etc. to compile with the libvirt library
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Requires: libvirt = %{version}
|
Requires: libvirt = %{version}-%{release}
|
||||||
Requires: pkgconfig
|
Requires: pkgconfig
|
||||||
%ifarch i386 x86_64 ia64
|
%if %{with_xen}
|
||||||
Requires: xen-devel
|
Requires: xen-devel
|
||||||
%endif
|
%endif
|
||||||
Requires: gnutls-devel
|
Obsoletes: libvir-devel <= 0.2
|
||||||
Obsoletes: libvir-devel
|
Provides: libvir-devel = %{version}-%{release}
|
||||||
|
|
||||||
%description devel
|
%description devel
|
||||||
Includes and documentations for the C library providing an API to use
|
Includes and documentations for the C library providing an API to use
|
||||||
the virtualization capabilities of recent versions of Linux (and other OSes).
|
the virtualization capabilities of recent versions of Linux (and other OSes).
|
||||||
|
|
||||||
|
%if %{with_python}
|
||||||
%package python
|
%package python
|
||||||
Summary: Python bindings for the libvirt library
|
Summary: Python bindings for the libvirt library
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Requires: libvirt = %{version}
|
Requires: libvirt = %{version}-%{release}
|
||||||
Obsoletes: libvir-python
|
Obsoletes: libvir-python <= 0.2
|
||||||
|
Provides: libvir-python = %{version}-%{release}
|
||||||
|
|
||||||
%description python
|
%description python
|
||||||
The libvirt-python package contains a module that permits applications
|
The libvirt-python package contains a module that permits applications
|
||||||
written in the Python programming language to use the interface
|
written in the Python programming language to use the interface
|
||||||
supplied by the libvirt library to use the the virtualization capabilities
|
supplied by the libvirt library to use the virtualization capabilities
|
||||||
of recent versions of Linux (and other OSes).
|
of recent versions of Linux (and other OSes).
|
||||||
|
%endif
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
|
||||||
|
%patch0 -p1
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch2 -p1
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
%patch5 -p1
|
||||||
|
%patch6 -p1
|
||||||
|
%patch7 -p1
|
||||||
|
%patch8 -p1
|
||||||
|
%patch9 -p1
|
||||||
|
%patch10 -p1
|
||||||
|
%patch11 -p1
|
||||||
|
%patch12 -p1
|
||||||
|
%patch13 -p1
|
||||||
|
%patch14 -p1
|
||||||
|
%patch15 -p1
|
||||||
|
%patch16 -p1
|
||||||
|
%patch17 -p1
|
||||||
|
%patch18 -p1
|
||||||
|
%patch19 -p1
|
||||||
|
%patch20 -p1
|
||||||
|
%patch21 -p1
|
||||||
|
%patch22 -p1
|
||||||
|
%patch23 -p1
|
||||||
|
%patch24 -p1
|
||||||
|
%patch25 -p1
|
||||||
|
%patch26 -p1
|
||||||
|
%patch27 -p1
|
||||||
|
%patch28 -p1
|
||||||
|
%patch29 -p1
|
||||||
|
|
||||||
|
%patch200 -p1
|
||||||
|
|
||||||
|
mv NEWS NEWS.old
|
||||||
|
iconv -f ISO-8859-1 -t UTF-8 < NEWS.old > NEWS
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# Xen is availble only on i386 x86_64 ia64
|
%if ! %{with_xen}
|
||||||
%ifarch i386 i686 x86_64 ia64
|
%define _without_xen --without-xen
|
||||||
%configure --with-init-script=redhat --with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid --with-remote-file=%{_localstatedir}/run/libvirtd.pid
|
|
||||||
%else
|
|
||||||
%configure --without-xen --with-init-script=redhat --with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid --with-remote-file=%{_localstatedir}/run/libvirtd.pid
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
make
|
%if ! %{with_qemu}
|
||||||
|
%define _without_qemu --without-qemu
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_openvz}
|
||||||
|
%define _without_openvz --without-openvz
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_lxc}
|
||||||
|
%define _without_lxc --without-lxc
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_sasl}
|
||||||
|
%define _without_sasl --without-sasl
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_avahi}
|
||||||
|
%define _without_avahi --without-avahi
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_polkit}
|
||||||
|
%define _without_polkit --without-polkit
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_python}
|
||||||
|
%define _without_python --without-python
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_libvirtd}
|
||||||
|
%define _without_libvirtd --without-libvirtd
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_uml}
|
||||||
|
%define _without_uml --without-uml
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_rhel5}
|
||||||
|
%define _with_rhel5_api --with-rhel5-api
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_network}
|
||||||
|
%define _without_network --without-network
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_storage_fs}
|
||||||
|
%define _without_storage_fs --without-storage-fs
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_storage_lvm}
|
||||||
|
%define _without_storage_lvm --without-storage-lvm
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_storage_iscsi}
|
||||||
|
%define _without_storage_iscsi --without-storage-iscsi
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_storage_disk}
|
||||||
|
%define _without_storage_disk --without-storage-disk
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_numactl}
|
||||||
|
%define _without_numactl --without-numactl
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%configure %{?_without_xen} \
|
||||||
|
%{?_without_qemu} \
|
||||||
|
%{?_without_openvz} \
|
||||||
|
%{?_without_lxc} \
|
||||||
|
%{?_without_sasl} \
|
||||||
|
%{?_without_avahi} \
|
||||||
|
%{?_without_polkit} \
|
||||||
|
%{?_without_python} \
|
||||||
|
%{?_without_libvirtd} \
|
||||||
|
%{?_without_uml} \
|
||||||
|
%{?_without_network} \
|
||||||
|
%{?_with_rhel5_api} \
|
||||||
|
%{?_without_storage_fs} \
|
||||||
|
%{?_without_storage_lvm} \
|
||||||
|
%{?_without_storage_iscsi} \
|
||||||
|
%{?_without_storage_disk} \
|
||||||
|
%{?_without_numactl} \
|
||||||
|
--with-init-script=redhat \
|
||||||
|
--with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid \
|
||||||
|
--with-remote-file=%{_localstatedir}/run/libvirtd.pid
|
||||||
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
%install
|
%install
|
||||||
rm -fr %{buildroot}
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
%makeinstall
|
%makeinstall
|
||||||
(cd docs/examples ; make clean ; rm -rf .deps Makefile Makefile.in)
|
(cd docs/examples ; make clean ; rm -rf .deps Makefile Makefile.in)
|
||||||
(cd docs/examples/python ; rm -f Makefile Makefile.in)
|
(cd docs/examples/python ; rm -rf .deps Makefile Makefile.in)
|
||||||
|
(cd examples/hellolibvirt ; make clean ; rm -rf .deps .libs Makefile Makefile.in)
|
||||||
|
(cd examples/domain-events/events-c ; make clean ;rm -rf .deps .libs Makefile Makefile.in)
|
||||||
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
|
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
|
rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la
|
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a
|
rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a
|
||||||
install -d -m 0755 $RPM_BUILD_ROOT%{_localstatedir}/run/libvirt/
|
install -d -m 0755 $RPM_BUILD_ROOT%{_localstatedir}/run/libvirt/
|
||||||
|
# Default dir for disk images defined in SELinux policy
|
||||||
|
install -d -m 0755 $RPM_BUILD_ROOT%{_localstatedir}/lib/libvirt/images/
|
||||||
|
# Default dir for kernel+initrd images defnied in SELinux policy
|
||||||
|
install -d -m 0755 $RPM_BUILD_ROOT%{_localstatedir}/lib/libvirt/boot/
|
||||||
|
# used for virDomainMemoryPeek
|
||||||
|
install -d -m 0700 $RPM_BUILD_ROOT%{_localstatedir}/cache/libvirt/
|
||||||
|
|
||||||
# Copy files from patch2 into location
|
%if %{with_qemu}
|
||||||
install -d $RPM_BUILD_ROOT%{_sysconfdir}/libvirt
|
|
||||||
install -m 0755 src/qemu.conf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu.conf
|
|
||||||
install -m 0755 qemud/libvirtd.conf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/libvirtd.conf
|
|
||||||
|
|
||||||
# We don't want to install /etc/libvirt/qemu/networks in the main %files list
|
# We don't want to install /etc/libvirt/qemu/networks in the main %files list
|
||||||
# because if the admin wants to delete the default network completely, we don't
|
# because if the admin wants to delete the default network completely, we don't
|
||||||
# want to end up re-incarnating it on every RPM upgrade.
|
# want to end up re-incarnating it on every RPM upgrade.
|
||||||
@@ -110,19 +440,39 @@ rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/default.xml
|
|||||||
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
||||||
# Strip auto-generated UUID - we need it generated per-install
|
# Strip auto-generated UUID - we need it generated per-install
|
||||||
sed -i -e "/<uuid>/d" $RPM_BUILD_ROOT%{_datadir}/libvirt/networks/default.xml
|
sed -i -e "/<uuid>/d" $RPM_BUILD_ROOT%{_datadir}/libvirt/networks/default.xml
|
||||||
|
%else
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/default.xml
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/libvirtd_qemu.aug
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
|
||||||
|
%endif
|
||||||
%find_lang %{name}
|
%find_lang %{name}
|
||||||
|
|
||||||
|
%if ! %{with_python}
|
||||||
|
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-python-%{version}
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{with_qemu}
|
||||||
|
rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu.conf
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_libvirtd}
|
||||||
|
chmod 0644 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/libvirtd
|
||||||
|
%endif
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
rm -fr %{buildroot}
|
rm -fr %{buildroot}
|
||||||
|
|
||||||
%post
|
%post
|
||||||
/sbin/ldconfig
|
/sbin/ldconfig
|
||||||
|
|
||||||
|
%if %{with_libvirtd}
|
||||||
|
%if %{with_qemu}
|
||||||
# We want to install the default network for initial RPM installs
|
# We want to install the default network for initial RPM installs
|
||||||
# or on the first upgrade from a non-network aware libvirt only.
|
# or on the first upgrade from a non-network aware libvirt only.
|
||||||
# We check this by looking to see if the daemon is already installed
|
# We check this by looking to see if the daemon is already installed
|
||||||
/sbin/chkconfig --list libvirtd 1>/dev/null 2>&1
|
/sbin/chkconfig --list libvirtd 1>/dev/null 2>&1
|
||||||
if [ $? != 0 ]
|
if [ $? != 0 -a ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ]
|
||||||
then
|
then
|
||||||
UUID=`/usr/bin/uuidgen`
|
UUID=`/usr/bin/uuidgen`
|
||||||
sed -e "s,</name>,</name>\n <uuid>$UUID</uuid>," \
|
sed -e "s,</name>,</name>\n <uuid>$UUID</uuid>," \
|
||||||
@@ -130,17 +480,20 @@ then
|
|||||||
> %{_sysconfdir}/libvirt/qemu/networks/default.xml
|
> %{_sysconfdir}/libvirt/qemu/networks/default.xml
|
||||||
ln -s ../default.xml %{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
ln -s ../default.xml %{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
||||||
fi
|
fi
|
||||||
|
%endif
|
||||||
|
|
||||||
/sbin/chkconfig --add libvirtd
|
/sbin/chkconfig --add libvirtd
|
||||||
|
%endif
|
||||||
|
|
||||||
%preun
|
%preun
|
||||||
|
%if %{with_libvirtd}
|
||||||
if [ $1 = 0 ]; then
|
if [ $1 = 0 ]; then
|
||||||
/sbin/service libvirtd stop 1>/dev/null 2>&1
|
/sbin/service libvirtd stop 1>/dev/null 2>&1
|
||||||
/sbin/chkconfig --del libvirtd
|
/sbin/chkconfig --del libvirtd
|
||||||
fi
|
fi
|
||||||
|
%endif
|
||||||
|
|
||||||
%postun
|
%postun -p /sbin/ldconfig
|
||||||
/sbin/ldconfig
|
|
||||||
|
|
||||||
%files -f %{name}.lang
|
%files -f %{name}.lang
|
||||||
%defattr(-, root, root)
|
%defattr(-, root, root)
|
||||||
@@ -150,22 +503,103 @@ fi
|
|||||||
%{_bindir}/virsh
|
%{_bindir}/virsh
|
||||||
%{_libdir}/lib*.so.*
|
%{_libdir}/lib*.so.*
|
||||||
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/
|
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/
|
||||||
|
|
||||||
|
%if %{with_qemu}
|
||||||
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/
|
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/
|
||||||
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/
|
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/
|
||||||
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/autostart
|
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/networks/autostart
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_libvirtd}
|
||||||
%{_sysconfdir}/rc.d/init.d/libvirtd
|
%{_sysconfdir}/rc.d/init.d/libvirtd
|
||||||
%config(noreplace) %{_sysconfdir}/sysconfig/libvirtd
|
%config(noreplace) %{_sysconfdir}/sysconfig/libvirtd
|
||||||
%config(noreplace) %{_sysconfdir}/libvirt/libvirtd.conf
|
%config(noreplace) %{_sysconfdir}/libvirt/libvirtd.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/logrotate.d/libvirtd
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_qemu}
|
||||||
%config(noreplace) %{_sysconfdir}/libvirt/qemu.conf
|
%config(noreplace) %{_sysconfdir}/libvirt/qemu.conf
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_sasl}
|
||||||
|
%config(noreplace) %{_sysconfdir}/sasl2/libvirt.conf
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_qemu}
|
||||||
%dir %{_datadir}/libvirt/
|
%dir %{_datadir}/libvirt/
|
||||||
%dir %{_datadir}/libvirt/networks/
|
%dir %{_datadir}/libvirt/networks/
|
||||||
%{_datadir}/libvirt/networks/default.xml
|
%{_datadir}/libvirt/networks/default.xml
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%dir %{_datadir}/libvirt/
|
||||||
|
%dir %{_datadir}/libvirt/schemas/
|
||||||
|
|
||||||
|
%{_datadir}/libvirt/schemas/domain.rng
|
||||||
|
%{_datadir}/libvirt/schemas/network.rng
|
||||||
|
%{_datadir}/libvirt/schemas/storagepool.rng
|
||||||
|
%{_datadir}/libvirt/schemas/storagevol.rng
|
||||||
|
%{_datadir}/libvirt/schemas/nodedev.rng
|
||||||
|
%{_datadir}/libvirt/schemas/capability.rng
|
||||||
|
|
||||||
%dir %{_localstatedir}/run/libvirt/
|
%dir %{_localstatedir}/run/libvirt/
|
||||||
|
|
||||||
%dir %{_localstatedir}/lib/libvirt/
|
%dir %{_localstatedir}/lib/libvirt/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/images/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/boot/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/cache/libvirt/
|
||||||
|
|
||||||
|
%if %{with_qemu}
|
||||||
|
%dir %{_localstatedir}/run/libvirt/qemu/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/qemu/
|
||||||
|
%endif
|
||||||
|
%if %{with_lxc}
|
||||||
|
%dir %{_localstatedir}/run/libvirt/lxc/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/lxc/
|
||||||
|
%endif
|
||||||
|
%if %{with_uml}
|
||||||
|
%dir %{_localstatedir}/run/libvirt/uml/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/uml/
|
||||||
|
%endif
|
||||||
|
%if %{with_network}
|
||||||
|
%dir %{_localstatedir}/run/libvirt/network/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/network/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/iptables/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/iptables/filter/
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/iptables/nat/
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_qemu}
|
||||||
|
%{_datadir}/augeas/lenses/libvirtd_qemu.aug
|
||||||
|
%{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_libvirtd}
|
||||||
|
%{_datadir}/augeas/lenses/libvirtd.aug
|
||||||
|
%{_datadir}/augeas/lenses/tests/test_libvirtd.aug
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_polkit}
|
||||||
|
%{_datadir}/PolicyKit/policy/org.libvirt.unix.policy
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/
|
||||||
|
%if %{with_qemu}
|
||||||
%dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/qemu/
|
%dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/qemu/
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_xen_proxy}
|
||||||
%attr(4755, root, root) %{_libexecdir}/libvirt_proxy
|
%attr(4755, root, root) %{_libexecdir}/libvirt_proxy
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_lxc}
|
||||||
|
%attr(0755, root, root) %{_libexecdir}/libvirt_lxc
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with_libvirtd}
|
||||||
|
%attr(0755, root, root) %{_libexecdir}/libvirt_parthelper
|
||||||
%attr(0755, root, root) %{_sbindir}/libvirtd
|
%attr(0755, root, root) %{_sbindir}/libvirtd
|
||||||
%doc docs/*.rng
|
%endif
|
||||||
|
|
||||||
%doc docs/*.xml
|
%doc docs/*.xml
|
||||||
|
|
||||||
%files devel
|
%files devel
|
||||||
@@ -175,6 +609,7 @@ fi
|
|||||||
%dir %{_includedir}/libvirt
|
%dir %{_includedir}/libvirt
|
||||||
%{_includedir}/libvirt/*.h
|
%{_includedir}/libvirt/*.h
|
||||||
%{_libdir}/pkgconfig/libvirt.pc
|
%{_libdir}/pkgconfig/libvirt.pc
|
||||||
|
%dir %{_datadir}/gtk-doc/html/libvirt
|
||||||
%doc %{_datadir}/gtk-doc/html/libvirt/*.devhelp
|
%doc %{_datadir}/gtk-doc/html/libvirt/*.devhelp
|
||||||
%doc %{_datadir}/gtk-doc/html/libvirt/*.html
|
%doc %{_datadir}/gtk-doc/html/libvirt/*.html
|
||||||
%doc %{_datadir}/gtk-doc/html/libvirt/*.png
|
%doc %{_datadir}/gtk-doc/html/libvirt/*.png
|
||||||
@@ -183,7 +618,9 @@ fi
|
|||||||
%doc docs/*.html docs/html docs/*.gif
|
%doc docs/*.html docs/html docs/*.gif
|
||||||
%doc docs/examples
|
%doc docs/examples
|
||||||
%doc docs/libvirt-api.xml
|
%doc docs/libvirt-api.xml
|
||||||
|
%doc examples
|
||||||
|
|
||||||
|
%if %{with_python}
|
||||||
%files python
|
%files python
|
||||||
%defattr(-, root, root)
|
%defattr(-, root, root)
|
||||||
|
|
||||||
@@ -194,8 +631,261 @@ fi
|
|||||||
%doc python/TODO
|
%doc python/TODO
|
||||||
%doc python/libvirtclass.txt
|
%doc python/libvirtclass.txt
|
||||||
%doc docs/examples/python
|
%doc docs/examples/python
|
||||||
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Aug 19 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-16.fc11
|
||||||
|
- Allow PCI bus reset to reset other devices (#499678)
|
||||||
|
- Fix stupid PCI reset error message (bug #499678)
|
||||||
|
- Allow PM reset on multi-function PCI devices (bug #515689)
|
||||||
|
- Re-attach PCI host devices after guest shuts down (bug #499561)
|
||||||
|
- Fixes list corruption after disk hot-unplug
|
||||||
|
- Fix minor 'virsh nodedev-list --tree' annoyance
|
||||||
|
|
||||||
|
* Thu Aug 13 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.2-15.fc11
|
||||||
|
- Log and ignore NUMA topology problems (rhbz #506590)
|
||||||
|
|
||||||
|
* Wed Aug 5 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.2-14.fc11
|
||||||
|
- Fix crash when attaching/detaching non-existant PCI device (rhbz #510907)
|
||||||
|
- Fix QEMU guest name/uuid uniqueness checks (rhbz #507405)
|
||||||
|
- Fix to use correct pci_add/del syntax for QEMU (rhbz #499669)
|
||||||
|
- Relabel disks before hotplugging them to guest (rhbz #496442)
|
||||||
|
- Correctly handle 8-bit high bytes when escaping XML (rhbz #479517)
|
||||||
|
|
||||||
|
* Fri Jul 3 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-13.fc11
|
||||||
|
- Fix libvirtd crash with bad capabilities data (bug #505635)
|
||||||
|
- Don't unnecessarily try to change a file context (bug #507555)
|
||||||
|
|
||||||
|
* Fri Jun 5 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-12.fc11
|
||||||
|
- Use the correct QEMU machine type for ppc (bug #502862)
|
||||||
|
- Fix crash with TLS connections (bug #503066)
|
||||||
|
- Fix broken networking with newer qemu releases (bug #503275)
|
||||||
|
- Remove the qemu BuildRequires
|
||||||
|
|
||||||
|
* Mon May 25 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-11.fc11
|
||||||
|
- Bring up the bridge, even if it doesn't have an IP address (bug #501912)
|
||||||
|
|
||||||
|
* Fri May 22 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-10.fc11
|
||||||
|
- Don't log monitor output to domain log file (bug #499584)
|
||||||
|
|
||||||
|
* Thu May 21 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-9.fc11
|
||||||
|
- Fix qemu argv detection with latest qemu (bug #501923)
|
||||||
|
- Fix XML attribute escaping (bug #499791)
|
||||||
|
- Fix serious event handling issues causing guests to be destroyed (bug #499698)
|
||||||
|
|
||||||
|
* Sun May 10 2009 Cole Robinson <crobinso@redhat.com> - 0.6.2-8.fc11
|
||||||
|
- Don't try to label a disk with no path (e.g. empty cdrom) (bug #499569)
|
||||||
|
|
||||||
|
* Thu May 7 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-7.fc11
|
||||||
|
- Enable migration for qemu 0.10 (bug #499704)
|
||||||
|
|
||||||
|
* Wed May 6 2009 Cole Robinson <crobinso@redhat.com> - 0.6.2-6.fc11
|
||||||
|
- Refresh qemu caps when getCapabilities is called (bug #460649)
|
||||||
|
|
||||||
|
* Wed May 6 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-5.fc11
|
||||||
|
- Fix handling of <hostdev managed='yes'> (bug #499386)
|
||||||
|
|
||||||
|
* Tue May 5 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.2-4.fc11
|
||||||
|
- Fix labelling of shared/readonly disks (rhbz #493692)
|
||||||
|
|
||||||
|
* Tue Apr 28 2009 Daniel Veillard <veillard@redhat.com> - 0.6.2-3.fc11
|
||||||
|
- Fix missing directories in spec (#496945 and gtk-doc)
|
||||||
|
|
||||||
|
* Thu Apr 16 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.2-2.fc11
|
||||||
|
- Fix qemu drive format specification (#496092)
|
||||||
|
|
||||||
|
* Fri Apr 3 2009 Daniel Veillard <veillard@redhat.com> - 0.6.2-1.fc11
|
||||||
|
- release of 0.6.2
|
||||||
|
- memory ballooning in QEMU
|
||||||
|
- SCSI HBA storage pool support
|
||||||
|
- support SASL auth for VNC server
|
||||||
|
- PCI passthrough in Xen driver
|
||||||
|
- assorted bug fixes
|
||||||
|
|
||||||
|
* Fri Apr 3 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.1-6.fc11
|
||||||
|
- Fix typo in previous patch
|
||||||
|
|
||||||
|
* Tue Mar 17 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.1-5.fc11
|
||||||
|
- Don't relabel shared/readonly disks
|
||||||
|
- Disable sound cards when running sVirt
|
||||||
|
|
||||||
|
* Tue Mar 17 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.1-4.fc11
|
||||||
|
- Fix memory allocation for xend lookup
|
||||||
|
- Avoid crash if storage volume deletion fails
|
||||||
|
- Fix multiple FD leaks
|
||||||
|
- Fix bug in dispatch FD events when a callback is marked deleted
|
||||||
|
- Fix parsing of storage volume owner/group/mode
|
||||||
|
- Fix memory allocation for virDomainGetVcpus RPC handler
|
||||||
|
- Avoid deadlock in setting vCPU count
|
||||||
|
- Use correct driver name in Xen block detach
|
||||||
|
|
||||||
|
* Mon Mar 9 2009 Cole Robinson <crobinso@redhat.com> - 0.6.1-3.fc11
|
||||||
|
- Add Requires: libselinux
|
||||||
|
|
||||||
|
* Fri Mar 6 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.1-2.fc11
|
||||||
|
- Fix crash after storage vol deletion fails
|
||||||
|
- Add patch to enable VNC SASL authentication
|
||||||
|
|
||||||
|
* Wed Mar 4 2009 Daniel Veillard <veillard@redhat.com> - 0.6.1-1.fc11
|
||||||
|
- upstream release 0.6.1
|
||||||
|
- support for node device detach reattach and reset
|
||||||
|
- sVirt mandatory access control support
|
||||||
|
- many bug fixes and small improvements
|
||||||
|
|
||||||
|
* Mon Mar 2 2009 Daniel Veillard <veillard@redhat.com> - 0.6.0-6.fc11
|
||||||
|
- make sure Xen is handled in i586 new default 32bits x86 packages
|
||||||
|
|
||||||
|
* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.6.0-5.fc11
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Feb 18 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.0-4.fc11
|
||||||
|
- Fix QEMU startup timeout/race (rhbz #484649)
|
||||||
|
- Setup DBus threading. Don't allow dbus to call _exit / change SIGPIPE (rhbz #484553)
|
||||||
|
- Fix timeout when autostarting session daemon
|
||||||
|
|
||||||
|
* Wed Feb 11 2009 Richard W.M. Jones <rjones@redhat.com> - 0.6.0-3.fc11
|
||||||
|
- Multiple fixes to remove rpmlint warnings/errors (rhbz #226055)
|
||||||
|
|
||||||
|
* Fri Feb 6 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.0-2.fc11
|
||||||
|
- Fix libvirtd --timeout usage
|
||||||
|
- Fix RPC call problems and QEMU startup handling (rhbz #484414)
|
||||||
|
- Fix unowned directories (rhbz #483442)
|
||||||
|
|
||||||
|
* Sat Jan 31 2009 Daniel Veillard <veillard@redhat.com> - 0.6.0-1.fc11
|
||||||
|
- upstream release 0.6.0
|
||||||
|
- thread safety of API
|
||||||
|
- allow QEmu/KVM domains to survive daemon restart
|
||||||
|
- extended logging capabilities
|
||||||
|
- support copy on write storage volumes for QEmu/KVM
|
||||||
|
- support of storage cache control options for QEmu/KVM
|
||||||
|
- a lot of bug fixes
|
||||||
|
|
||||||
|
* Wed Dec 17 2008 Daniel Veillard <veillard@redhat.com> - 0.5.1-2.fc11
|
||||||
|
- fix missing read-only access checks, fixes CVE-2008-5086
|
||||||
|
|
||||||
|
* Fri Dec 5 2008 Daniel Veillard <veillard@redhat.com> - 0.5.1-1.fc11
|
||||||
|
- upstream release 0.5.1
|
||||||
|
- mostly bugfixes e.g #473071
|
||||||
|
- some driver improvments
|
||||||
|
|
||||||
|
* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 0.5.0-2
|
||||||
|
- Rebuild for Python 2.6
|
||||||
|
|
||||||
|
* Wed Nov 26 2008 Daniel Veillard <veillard@redhat.com> - 0.5.0-1.fc11
|
||||||
|
- upstream release 0.5.0
|
||||||
|
- domain lifecycle event support
|
||||||
|
- node device enumeration
|
||||||
|
- KVM/QEmu migration support
|
||||||
|
- improved LXC support
|
||||||
|
- SDL display configuration
|
||||||
|
- User Mode Linux driver (Daniel Berrange)
|
||||||
|
|
||||||
|
* Wed Sep 24 2008 Daniel Veillard <veillard@redhat.com> - 0.4.6-3.fc10
|
||||||
|
- apply the python makefile patch for #463733
|
||||||
|
|
||||||
|
* Wed Sep 24 2008 Daniel Veillard <veillard@redhat.com> - 0.4.6-2.fc10
|
||||||
|
- upstream release 0.4.6
|
||||||
|
- fixes some problems with 0.4.5
|
||||||
|
|
||||||
|
* Tue Sep 9 2008 Daniel Veillard <veillard@redhat.com> - 0.4.5-2.fc10
|
||||||
|
- fix a crash if a QEmu/KVM domain is defined without an emulator path
|
||||||
|
|
||||||
|
* Mon Sep 8 2008 Daniel Veillard <veillard@redhat.com> - 0.4.5-1.fc10
|
||||||
|
- upstream release 0.4.5
|
||||||
|
- a lot of bug fixes
|
||||||
|
- major updates to QEmu/KVM and Linux containers drivers
|
||||||
|
- support for OpenVZ if installed
|
||||||
|
|
||||||
|
* Thu Aug 7 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 0.4.4-3.fc10
|
||||||
|
- fix license tag
|
||||||
|
|
||||||
|
* Tue Jul 8 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.4-2.fc10
|
||||||
|
- Fix booting of CDROM images with KVM (rhbz #452355)
|
||||||
|
|
||||||
|
* Wed Jun 25 2008 Daniel Veillard <veillard@redhat.com> - 0.4.4-1.fc10
|
||||||
|
- upstream release 0.4.4
|
||||||
|
- fix a few bugs in previous release
|
||||||
|
|
||||||
|
* Thu Jun 12 2008 Daniel Veillard <veillard@redhat.com> - 0.4.3-1.fc10
|
||||||
|
- upstream release 0.4.3
|
||||||
|
- many bug fixes
|
||||||
|
- many small improvements
|
||||||
|
- serious xenner fixes
|
||||||
|
|
||||||
|
* Wed Jun 4 2008 Mark McLoughlin <markmc@redhat.com> - 0.4.2-6.fc10
|
||||||
|
- Disable lokkit support again (#449996, #447633)
|
||||||
|
- Ensure %-fedora is evaluated correctly
|
||||||
|
|
||||||
|
* Thu May 15 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.2-5.fc10
|
||||||
|
- Rebuild with policy enabled (rhbz #446616)
|
||||||
|
|
||||||
|
* Fri May 9 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.2-4.fc10
|
||||||
|
- Added directory for initrd/kernel images for SELinux policy
|
||||||
|
|
||||||
|
* Mon Apr 28 2008 Mark McLoughlin <markmc@redhat.com> - 0.4.2-3.fc10
|
||||||
|
- Simplify the way arch conditionals are handled
|
||||||
|
|
||||||
|
* Mon Apr 28 2008 Mark McLoughlin <markmc@redhat.com> - 0.4.2-2.fc10
|
||||||
|
- Enable lokkit support (#443796)
|
||||||
|
|
||||||
|
* Tue Apr 8 2008 Daniel Veillard <veillard@redhat.com> - 0.4.2-1.fc9
|
||||||
|
- upstream release 0.4.2
|
||||||
|
- many bug fixes
|
||||||
|
- localization updates
|
||||||
|
|
||||||
|
* Thu Apr 4 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.1-7.fc9
|
||||||
|
- Don't run polkit-auth as root
|
||||||
|
- Don't request polkit auth if client is root
|
||||||
|
|
||||||
|
* Fri Mar 28 2008 Chris Lalancette <clalance@redhat.com> - 0.4.1-6.fc9
|
||||||
|
- When dumping XML for a storage pool, make the <source> directory tag
|
||||||
|
match the <dir> tag used for specifying the pool in the first place
|
||||||
|
|
||||||
|
* Thu Mar 27 2008 Chris Lalancette <clalance@redhat.com> - 0.4.1-5.fc9
|
||||||
|
- Do iscsiadm sendtarget before trying to do login
|
||||||
|
- Do sysfs scanning for iSCSI LUNs instead of trying to parse them from
|
||||||
|
iscsiadm session output
|
||||||
|
|
||||||
|
* Thu Mar 13 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.1-4.fc9
|
||||||
|
- Fix QEMU tap device setup
|
||||||
|
- Fix Xen boot device XML processing
|
||||||
|
- Fixed QEMU cdrom media change
|
||||||
|
|
||||||
|
* Mon Mar 10 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.1-3.fc9
|
||||||
|
- Fixed daemon startup when run with --daemon flag
|
||||||
|
|
||||||
|
* Mon Mar 3 2008 Daniel Veillard <veillard@redhat.com> - 0.4.1-2.fc9
|
||||||
|
- 2 patches found just after the release
|
||||||
|
|
||||||
|
* Mon Mar 3 2008 Daniel Veillard <veillard@redhat.com> - 0.4.1-1.fc9
|
||||||
|
- Release of 0.4.1
|
||||||
|
- Storage APIs
|
||||||
|
- xenner support
|
||||||
|
- lots of assorted improvements, bugfixes and cleanups
|
||||||
|
- documentation and localization improvements
|
||||||
|
|
||||||
|
* Wed Feb 20 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 0.4.0-5
|
||||||
|
- Autorebuild for GCC 4.3
|
||||||
|
|
||||||
|
* Fri Jan 18 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.0-4.fc9
|
||||||
|
- Fix SSH tunnelling (rhbz #428743)
|
||||||
|
- Fix back-compat for nodeinfo call changes.
|
||||||
|
|
||||||
|
* Sun Jan 13 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.0-3.fc9
|
||||||
|
- Fix crash when no auth callback
|
||||||
|
|
||||||
|
* Wed Jan 2 2008 Daniel P. Berrange <berrange@redhat.com> - 0.4.0-2.fc9
|
||||||
|
- Fix reading large config files (rhbz #426425)
|
||||||
|
- Fix crash when connecting to a PolicyKit enabled server with not auth callback (rhbz #427107)
|
||||||
|
|
||||||
|
* Tue Dec 18 2007 Daniel Veillard <veillard@redhat.com> - 0.4.0-1.fc8
|
||||||
|
- Release of 0.4.0
|
||||||
|
- SASL based authentication
|
||||||
|
- PolicyKit authentication
|
||||||
|
- improved NUMA and statistics support
|
||||||
|
- lots of assorted improvements, bugfixes and cleanups
|
||||||
|
- documentation and localization improvements
|
||||||
|
|
||||||
* Mon Oct 15 2007 Daniel P. Berrange <berrange@redhat.com> - 0.3.3-2.fc8
|
* Mon Oct 15 2007 Daniel P. Berrange <berrange@redhat.com> - 0.3.3-2.fc8
|
||||||
- Added QEMU driver config file support
|
- Added QEMU driver config file support
|
||||||
- Added example config files
|
- Added example config files
|
||||||
@@ -309,7 +999,7 @@ fi
|
|||||||
- it's pkgconfig not pgkconfig !
|
- it's pkgconfig not pgkconfig !
|
||||||
|
|
||||||
* Mon Nov 6 2006 Daniel Veillard <veillard@redhat.com> 0.1.8-2
|
* Mon Nov 6 2006 Daniel Veillard <veillard@redhat.com> 0.1.8-2
|
||||||
- fixing spec file, added %dist, -devel requires pkgconfig and xen-devel
|
- fixing spec file, added %-dist, -devel requires pkgconfig and xen-devel
|
||||||
- Resolves: rhbz#202320
|
- Resolves: rhbz#202320
|
||||||
|
|
||||||
* Mon Oct 16 2006 Daniel Veillard <veillard@redhat.com> 0.1.8-1
|
* Mon Oct 16 2006 Daniel Veillard <veillard@redhat.com> 0.1.8-1
|
||||||
|
|||||||
Reference in New Issue
Block a user