Blob Blame History Raw
From 7c96ce960b84ba19b9cc8e090615f54206e44ff0 Mon Sep 17 00:00:00 2001
From: Laine Stump <laine@laine.org>
Date: Tue, 6 Dec 2011 12:47:28 -0500
Subject: [PATCH] qemu: replace deprecated fedora-13 machine type with pc-0.14

This addresses https://bugzilla.redhat.com/show_bug.cgi?id=754772 .
It should only be applied to Fedora builds of libvirt, F15 and
later, so there is no upstream equivalent patch.

Background:

During the lifetime of Fedora 13, some features were backported into
the F13 build of qemu-kvm from upstream. These features were part of
the functionality of machine type "pc-0.13" in upstream qemu-kvm, so a
special "fedora-13" machine type was created for the F13 qemu-kvm.
Since "fedora-13" became the new "canonical machine type", all new
domains created with F13 libvirt tools by default contained that
machine type in their configuration file.

In Fedora 14, a patch was made to qemu to treat the fedora-13 machine
type as equivalent to "pc-0.13". When Fedora 15 was released, this was
inadvertently changed to make it equivalent to "pc-0.14".

With the release of Fedora 16, qemu-kvm initially removed support for
this machine type, which caused failure of many guest configurations
to start. qemu-kvm subsequently re-added the patch to support
fedora-13 (as equivalent to pc-0.14), but with the promise that they
could remove it with the release of Fedora 17. (see
https://bugzilla.redhat.com/show_bug.cgi?id=748218 ).

Solution:

In order to create a repeat of the recent problems, prior to F17
existing guest configurations need to be updated to change fedora-13
to pc-0.14 (which has been determined to be equivalent for all
practical purposes in both F15 and F16). That's what this patch does:

1) Each time libvirtd is started, it calls virDomainLoadAllConfigs()
which calls virDomainLoadConfig(); this function has been modified to
check for os.machine == "fedora-13", and change it to "pc-0.14" then
write the updated config back to disk.

2) Also, any other time a domain definition is parsed, the parsed
version in memory is changed to turn "fedora-13" into "pc-0.14". This
handles domains that had been saved to disk prior to the upgrade, and
are subsequently restarted.

3) Finally, whenever a domain definition is formatted into a string,
any occurrence of fedora-13 is replaced with pc-0.14 *directly in the
virDomainDef* (to avoid multiple warning messages for the same object
when it's formatted multiple times). This should deal with those cases
where a domain was running at the time of upgrade, and is later
saved/snapshotted.

I had considered doing this with some sed commands in the specfile,
but that wouldn't do anything to help the xml saved in image files.

(Also, one of the xml tests was using the machine type "fedora-13",
and since that machine type is treated specially by the rest of this
patch, it was failing. That has been changed in a separate patch,
which must be applied with this patch, and which *is* also upstream).
---
 src/conf/domain_conf.c |   62 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f8d0a4c..c79014b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8394,7 +8394,25 @@ virDomainDefPtr virDomainDefParseString(virCapsPtr caps,
                                         unsigned int expectedVirtTypes,
                                         unsigned int flags)
 {
-    return virDomainDefParse(xmlStr, NULL, caps, expectedVirtTypes, flags);
+    virDomainDefPtr def
+        = virDomainDefParse(xmlStr, NULL, caps, expectedVirtTypes, flags);
+
+    /* Fedora-specific HACK - treat fedora-13 and pc-0.14 as equivalent.
+     * This handles the case of domains that had been saved to an image file
+     * prior to upgrade (save or snapshot), then restarted/reverted.
+     */
+    if (def && STREQ_NULLABLE(def->os.machine, "fedora-13")) {
+        VIR_FREE(def->os.machine);
+        if (!(def->os.machine = strdup("pc-0.14"))) {
+            virReportOOMError();
+            virDomainDefFree(def);
+            def = NULL;
+        } else {
+            VIR_WARN("Replacing deprecated 'fedora-13' machine type "
+                     "with equivalent 'pc-0.14' in domain %s xml", def->name);
+        }
+   }
+    return def;
 }
 
 virDomainDefPtr virDomainDefParseFile(virCapsPtr caps,
@@ -11737,8 +11755,30 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     virBufferAddLit(buf, "    <type");
     if (def->os.arch)
         virBufferAsprintf(buf, " arch='%s'", def->os.arch);
-    if (def->os.machine)
-        virBufferAsprintf(buf, " machine='%s'", def->os.machine);
+    if (def->os.machine) {
+        /* Fedora-specific HACK - replace "fedora-13" with "pc-0.14"
+         * (in the original DomainDef as well as in the xml output).
+         * This will catch XML being written to save/migration images
+         * of domains that were running when libvirtd was restarted at
+         * the time of upgrade.
+         */
+        if (STREQ_NULLABLE(def->os.machine, "fedora-13")) {
+            virBufferAddLit(buf, " machine='pc-0.14'");
+            VIR_WARN("substituting machine type 'fedora-13' with 'pc-0.14' "
+                     "in domain %s", def->name);
+            /* It's not exactly nice to modify the source object,
+             * but sometimes virDomainFormat is called > 100 times for the
+             * same object, which would result in far too many warning logs.
+             */
+            VIR_FREE(def->os.machine);
+            if (!(def->os.machine = strdup("pc-0.14"))) {
+                virReportOOMError();
+                goto cleanup;
+            }
+        } else {
+            virBufferAsprintf(buf, " machine='%s'", def->os.machine);
+        }
+    }
     /*
      * HACK: For xen driver we previously used bogus 'linux' as the
      * os type for paravirt, whereas capabilities declare it to
@@ -12149,6 +12189,22 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps,
                                       VIR_DOMAIN_XML_INACTIVE)))
         goto error;
 
+    /* Fedora-specific HACK - replace "fedora-13" with "pc-0.14".
+     * This updates all config files at the first restart of libvirt
+     * after upgrade.
+     */
+    if (STREQ_NULLABLE(def->os.machine, "fedora-13")) {
+        VIR_FREE(def->os.machine);
+        if (!(def->os.machine = strdup("pc-0.14"))) {
+            virReportOOMError();
+            goto error;
+        }
+        VIR_WARN("Replacing deprecated 'fedora-13' machine type "
+                 "with equivalent 'pc-0.14' in domain %s configuration file", name);
+        if (virDomainSaveConfig(configDir, def) < 0)
+            goto error;
+    }
+
     if ((autostartLink = virDomainConfigFile(autostartDir, name)) == NULL)
         goto error;
 
-- 
1.7.7.6