]> xenbits.xensource.com Git - libvirt.git/commitdiff
Probe QEMU directly for machine aliases if not found in capabilties
authorMark McLoughlin <markmc@redhat.com>
Thu, 23 Jul 2009 17:31:34 +0000 (18:31 +0100)
committerMark McLoughlin <markmc@redhat.com>
Mon, 27 Jul 2009 14:17:55 +0000 (15:17 +0100)
Not all possible emulators are actually in the capabilities, so if we
don't find the supplied emulator we should probe it directly for machine
types.

* src/qemu_driver.c: add qemudCanonicalizeMachineDirect() to directly
  probe an emulator for the canonical machine type

src/qemu_conf.c
src/qemu_conf.h
src/qemu_driver.c

index 598d008d5bd674de70d8cfa6221d2ff0fd0a1f83..a3986dff3d13ec0ac24c544babedf6a98cbb9bf3 100644 (file)
@@ -401,7 +401,7 @@ error:
     return -1;
 }
 
-static int
+int
 qemudProbeMachineTypes(const char *binary,
                        virCapsGuestMachinePtr **machines,
                        int *nmachines)
index e753ba07ea49c1f772def46cc5f5560e8dcee132..316a787e98c7152e14fef4bd5eee1edab6b8a549 100644 (file)
@@ -168,6 +168,10 @@ int         qemuBuildNicStr             (virConnectPtr conn,
 int         qemuAssignNetNames          (virDomainDefPtr def,
                                          virDomainNetDefPtr net);
 
+int         qemudProbeMachineTypes      (const char *binary,
+                                         virCapsGuestMachinePtr **machines,
+                                         int *nmachines);
+
 virDomainDefPtr qemuParseCommandLine(virConnectPtr conn,
                                      virCapsPtr caps,
                                      const char **progenv,
index 3af35563e936278a3373eea6001c645098072223..d5db9aebf2f296ebac9eff395e53796dcaa54d75 100644 (file)
@@ -4286,6 +4286,34 @@ qemudCanonicalizeMachineFromInfo(virDomainDefPtr def,
     return 0;
 }
 
+static int
+qemudCanonicalizeMachineDirect(virDomainDefPtr def, char **canonical)
+{
+    virCapsGuestMachinePtr *machines = NULL;
+    int i, nmachines = 0;
+
+    if (qemudProbeMachineTypes(def->emulator, &machines, &nmachines) < 0) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    for (i = 0; i < nmachines; i++) {
+        if (!machines[i]->canonical)
+            continue;
+
+        if (strcmp(def->os.machine, machines[i]->name) != 0)
+            continue;
+
+        *canonical = machines[i]->canonical;
+        machines[i]->canonical = NULL;
+        break;
+    }
+
+    virCapabilitiesFreeMachines(machines, nmachines);
+
+    return 0;
+}
+
 static int
 qemudCanonicalizeMachine(virConnectPtr conn, virDomainDefPtr def)
 {
@@ -4323,6 +4351,10 @@ qemudCanonicalizeMachine(virConnectPtr conn, virDomainDefPtr def)
             goto out;
         }
     }
+
+    if (qemudCanonicalizeMachineDirect(def, &canonical) < 0)
+        return -1;
+
 out:
     if (canonical) {
         VIR_FREE(def->os.machine);