From a05e64b718123f7865339dac5ad1cb688aee99f2 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 4 May 2007 14:18:11 +0000 Subject: [PATCH] Fixed misc QEMU & Xen bugs --- libvirt-0.2.2-disable-xm.patch | 15 +++ libvirt-0.2.2-dnsmasq-order.patch | 23 +++++ libvirt-0.2.2-graphics-hvm.patch | 70 +++++++++++++ libvirt-0.2.2-qemu-noreboot.patch | 128 ++++++++++++++++++++++++ libvirt-0.2.2-sync-daemon-restart.patch | 19 ++++ libvirt.spec | 21 +++- 6 files changed, 274 insertions(+), 2 deletions(-) create mode 100644 libvirt-0.2.2-disable-xm.patch create mode 100644 libvirt-0.2.2-dnsmasq-order.patch create mode 100644 libvirt-0.2.2-graphics-hvm.patch create mode 100644 libvirt-0.2.2-qemu-noreboot.patch create mode 100644 libvirt-0.2.2-sync-daemon-restart.patch diff --git a/libvirt-0.2.2-disable-xm.patch b/libvirt-0.2.2-disable-xm.patch new file mode 100644 index 0000000..51a9b68 --- /dev/null +++ b/libvirt-0.2.2-disable-xm.patch @@ -0,0 +1,15 @@ +diff -rup libvirt-0.2.2/src/xen_unified.c libvirt-0.2.2.new/src/xen_unified.c +--- libvirt-0.2.2/src/xen_unified.c 2007-04-17 04:38:52.000000000 -0400 ++++ libvirt-0.2.2.new/src/xen_unified.c 2007-05-01 16:49:54.000000000 -0400 +@@ -112,6 +112,11 @@ xenUnifiedOpen (virConnectPtr conn, cons + for (i = 0; i < nb_drivers; ++i) { + int failed_to_open = 1; + ++ /* Only use XM driver for Xen <= 3.0.3 (ie xendConfigVersion <= 2) */ ++ if (drivers[i] == &xenXMDriver && ++ priv->xendConfigVersion > 2) ++ continue; ++ + /* Ignore proxy for root */ + if (i == proxy_offset && getuid() == 0) + continue; diff --git a/libvirt-0.2.2-dnsmasq-order.patch b/libvirt-0.2.2-dnsmasq-order.patch new file mode 100644 index 0000000..372a3f9 --- /dev/null +++ b/libvirt-0.2.2-dnsmasq-order.patch @@ -0,0 +1,23 @@ +diff -rup libvirt-0.2.2/qemud/qemud.c libvirt-0.2.2.new/qemud/qemud.c +--- libvirt-0.2.2/qemud/qemud.c 2007-04-11 10:13:36.000000000 -0400 ++++ libvirt-0.2.2.new/qemud/qemud.c 2007-05-01 16:51:15.000000000 -0400 +@@ -1110,6 +1110,7 @@ qemudBuildDnsmasqArgv(struct qemud_serve + len = + 1 + /* dnsmasq */ + 1 + /* --keep-in-foreground */ ++ 1 + /* --strict-order */ + 1 + /* --bind-interfaces */ + 2 + /* --pid-file "" */ + 2 + /* --conf-file "" */ +@@ -1133,6 +1134,11 @@ qemudBuildDnsmasqArgv(struct qemud_serve + APPEND_ARG(*argv, i++, "dnsmasq"); + + APPEND_ARG(*argv, i++, "--keep-in-foreground"); ++ /* ++ * Needed to ensure dnsmasq uses same algorithm for processing ++ * multiple nameserver entries in /etc/resolv.conf as GLibC. ++ */ ++ APPEND_ARG(*argv, i++, "--strict-order"); + APPEND_ARG(*argv, i++, "--bind-interfaces"); + + APPEND_ARG(*argv, i++, "--pid-file"); diff --git a/libvirt-0.2.2-graphics-hvm.patch b/libvirt-0.2.2-graphics-hvm.patch new file mode 100644 index 0000000..b0b80e7 --- /dev/null +++ b/libvirt-0.2.2-graphics-hvm.patch @@ -0,0 +1,70 @@ +diff -rup libvirt-0.2.2.new/src/xend_internal.c libvirt-0.2.2/src/xend_internal.c +--- libvirt-0.2.2.new/src/xend_internal.c 2007-04-15 16:09:10.000000000 -0400 ++++ libvirt-0.2.2/src/xend_internal.c 2007-05-03 14:52:42.000000000 -0400 +@@ -1676,35 +1676,38 @@ xend_parse_sexp_desc(virConnectPtr conn, + } + } + +- /* Graphics device (HVM <= 3.0.4, or PV <= 3.0.4) vnc config */ +- tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux"); +- if (tmp != NULL) { +- if (tmp[0] == '1') { +- int port = xenStoreDomainGetVNCPort(conn, domid); +- const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux"); +- const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux"); +- /* For Xen >= 3.0.3, don't generate a fixed port mapping +- * because it will almost certainly be wrong ! Just leave +- * it as -1 which lets caller see that the VNC server isn't +- * present yet. Subsquent dumps of the XML will eventually +- * find the port in XenStore once VNC server has started +- */ +- if (port == -1 && xendConfigVersion < 2) +- port = 5900 + domid; +- virBufferVSprintf(&buf, " \n", 3); ++ /* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */ ++ if ((hvm && xendConfigVersion < 4) || ++ (!hvm && xendConfigVersion < 3)) { ++ tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux"); ++ if (tmp != NULL) { ++ if (tmp[0] == '1') { ++ int port = xenStoreDomainGetVNCPort(conn, domid); ++ const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux"); ++ const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux"); ++ /* For Xen >= 3.0.3, don't generate a fixed port mapping ++ * because it will almost certainly be wrong ! Just leave ++ * it as -1 which lets caller see that the VNC server isn't ++ * present yet. Subsquent dumps of the XML will eventually ++ * find the port in XenStore once VNC server has started ++ */ ++ if (port == -1 && xendConfigVersion < 2) ++ port = 5900 + domid; ++ virBufferVSprintf(&buf, " \n", 3); ++ } + } +- } + +- /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */ +- tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux"); +- if (tmp != NULL) { +- if (tmp[0] == '1') +- virBufferAdd(&buf, " \n", 27 ); ++ /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */ ++ tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux"); ++ if (tmp != NULL) { ++ if (tmp[0] == '1') ++ virBufferAdd(&buf, " \n", 27 ); ++ } + } + + tty = xenStoreDomainGetConsolePath(conn, domid); +Only in libvirt-0.2.2/src: xend_internal.c.orig diff --git a/libvirt-0.2.2-qemu-noreboot.patch b/libvirt-0.2.2-qemu-noreboot.patch new file mode 100644 index 0000000..ff2caa3 --- /dev/null +++ b/libvirt-0.2.2-qemu-noreboot.patch @@ -0,0 +1,128 @@ +diff -rup libvirt-0.2.2/qemud/conf.c libvirt-0.2.2.new/qemud/conf.c +--- libvirt-0.2.2/qemud/conf.c 2007-04-17 04:34:42.000000000 -0400 ++++ libvirt-0.2.2.new/qemud/conf.c 2007-05-01 18:16:46.000000000 -0400 +@@ -245,21 +245,25 @@ static int qemudExtractVersionInfo(const + cleanup1: + _exit(-1); /* Just in case */ + } else { /* Parent */ +- char help[4096]; /* Ought to be enough to hold QEMU help screen */ ++ char help[8192]; /* Ought to be enough to hold QEMU help screen */ + int got, ret = -1; + int major, minor, micro; + + if (close(newstdout[1]) < 0) + goto cleanup2; + +- reread: +- if ((got = read(newstdout[0], help, sizeof(help)-1)) < 0) { +- if (errno == EINTR) +- goto reread; +- goto cleanup2; ++ while (got < (sizeof(help)-1)) { ++ int len; ++ if ((len = read(newstdout[0], help+got, sizeof(help)-got-1)) <= 0) { ++ if (!len) ++ break; ++ if (errno == EINTR) ++ continue; ++ goto cleanup2; ++ } ++ got += len; + } + help[got] = '\0'; +- + if (sscanf(help, "QEMU PC emulator version %d.%d.%d", &major,&minor, µ) != 3) { + goto cleanup2; + } +@@ -267,6 +271,8 @@ static int qemudExtractVersionInfo(const + *version = (major * 1000 * 1000) + (minor * 1000) + micro; + if (strstr(help, "-no-kqemu")) + *flags |= QEMUD_CMD_FLAG_KQEMU; ++ if (strstr(help, "-no-reboot")) ++ *flags |= QEMUD_CMD_FLAG_NO_REBOOT; + if (*version >= 9000) + *flags |= QEMUD_CMD_FLAG_VNC_COLON; + ret = 0; +@@ -858,6 +864,22 @@ static struct qemud_vm_def *qemudParseXM + } + xmlXPathFreeObject(obj); + ++ ++ /* See if we disable reboots */ ++ obj = xmlXPathEval(BAD_CAST "string(/domain/on_reboot)", ctxt); ++ if ((obj == NULL) || (obj->type != XPATH_STRING) || ++ (obj->stringval == NULL) || (obj->stringval[0] == 0)) { ++ def->noReboot = 0; ++ } else { ++ if (!strcmp((char*)obj->stringval, "destroy")) ++ def->noReboot = 1; ++ else ++ def->noReboot = 0; ++ } ++ if (obj) ++ xmlXPathFreeObject(obj); ++ ++ + /* Extract OS type info */ + obj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt); + if ((obj == NULL) || (obj->type != XPATH_STRING) || +@@ -1220,6 +1242,8 @@ int qemudBuildCommandLine(struct qemud_s + 2 + /* cpus */ + 2 + /* boot device */ + 2 + /* monitor */ ++ (server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && ++ vm->def->noReboot ? 1 : 0) + /* no-reboot */ + (vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */ + (vm->def->os.kernel[0] ? 2 : 0) + /* kernel */ + (vm->def->os.initrd[0] ? 2 : 0) + /* initrd */ +@@ -1255,6 +1279,11 @@ int qemudBuildCommandLine(struct qemud_s + goto no_memory; + if (!((*argv)[++n] = strdup("pty"))) + goto no_memory; ++ if (server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT && ++ vm->def->noReboot) { ++ if (!((*argv)[++n] = strdup("-no-reboot"))) ++ goto no_memory; ++ } + + if (!(vm->def->features & QEMUD_FEATURE_ACPI)) { + if (!((*argv)[++n] = strdup("-no-acpi"))) +@@ -2517,6 +2546,17 @@ char *qemudGenerateXML(struct qemud_serv + goto no_memory; + } + ++ if (bufferAdd(buf, " destroy\n", -1) < 0) ++ goto no_memory; ++ if (def->noReboot) { ++ if (bufferAdd(buf, " destroy\n", -1) < 0) ++ goto no_memory; ++ } else { ++ if (bufferAdd(buf, " restart\n", -1) < 0) ++ goto no_memory; ++ } ++ if (bufferAdd(buf, " destroy\n", -1) < 0) ++ goto no_memory; + + if (bufferAdd(buf, " \n", -1) < 0) + goto no_memory; +diff -rup libvirt-0.2.2/qemud/internal.h libvirt-0.2.2.new/qemud/internal.h +--- libvirt-0.2.2/qemud/internal.h 2007-04-11 10:13:36.000000000 -0400 ++++ libvirt-0.2.2.new/qemud/internal.h 2007-05-01 17:53:42.000000000 -0400 +@@ -161,6 +161,7 @@ enum qemud_vm_grapics_type { + enum qemud_cmd_flags { + QEMUD_CMD_FLAG_KQEMU = 1, + QEMUD_CMD_FLAG_VNC_COLON = 2, ++ QEMUD_CMD_FLAG_NO_REBOOT = 4, + }; + + +@@ -191,6 +192,8 @@ struct qemud_vm_def { + int maxmem; + int vcpus; + ++ int noReboot; ++ + struct qemud_vm_os_def os; + + int features; +Only in libvirt-0.2.2.new/qemud: libvirt-0.2.2-qemu-noreboot.patch diff --git a/libvirt-0.2.2-sync-daemon-restart.patch b/libvirt-0.2.2-sync-daemon-restart.patch new file mode 100644 index 0000000..efddd13 --- /dev/null +++ b/libvirt-0.2.2-sync-daemon-restart.patch @@ -0,0 +1,19 @@ +--- libvirt-0.2.2/ChangeLog.sync-restart 2007-05-02 13:07:21.719425000 -0400 ++++ libvirt-0.2.2/ChangeLog 2007-05-02 13:08:23.204879000 -0400 +@@ -0,0 +1,5 @@ ++Wed May 2 17:55:12 IST 2007 Mark McLoughlin ++ ++ * qemud/libvirtd.in: synchronously restart the daemon in ++ order to avoid https://bugzilla.redhat.com/238492 ++ +--- libvirt-0.2.2/qemud/libvirtd.in.sync-restart 2007-02-23 07:50:58.000000000 -0500 ++++ libvirt-0.2.2/qemud/libvirtd.in 2007-05-02 13:08:23.209868000 -0400 +@@ -34,7 +34,7 @@ + stop() { + echo -n $"Stopping $SERVICE daemon: " + +- killproc $PROCESS -TERM ++ killproc $PROCESS + RETVAL=$? + echo + if [ $RETVAL -eq 0 ]; then diff --git a/libvirt.spec b/libvirt.spec index 86b0de4..174338c 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -9,10 +9,15 @@ Summary: Library providing a simple API virtualization Name: libvirt Version: 0.2.2 -Release: 2%{?_extra_release} +Release: 3%{?_extra_release} License: LGPL Group: Development/Libraries Source: libvirt-%{version}.tar.gz +Patch1: libvirt-0.2.2-disable-xm.patch +Patch2: libvirt-0.2.2-dnsmasq-order.patch +Patch3: libvirt-0.2.2-qemu-noreboot.patch +Patch4: libvirt-0.2.2-sync-daemon-restart.patch +Patch5: libvirt-0.2.2-graphics-hvm.patch BuildRoot: %{_tmppath}/%{name}-%{version}-root URL: http://libvirt.org/ BuildRequires: python python-devel @@ -54,11 +59,16 @@ Obsoletes: libvir-python %description python The libvirt-python package contains a module that permits applications 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 the virtualization capabilities of recent versions of Linux (and other OSes). %prep %setup -q +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build %configure --with-init-script=redhat --with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid @@ -170,6 +180,13 @@ fi %doc docs/examples/python %changelog +* Thu May 3 2007 Daniel P. Berrange - 0.2.2-3.fc7 +- Fixed init script restart race +- Remove duplicate tag for HVM +- Support -no-reboot in qemu for installs +- Disable xm config file driver for 3.0.5 +- Force dnsmasq ordering for resolv.conf + * Fri Apr 21 2007 Daniel P. Berrange - 0.2.2-2.fc7 - Added Requires on dnsmasq for virtual networking