diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 38fe7fc023..6ebddf5f2a 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -549,22 +549,43 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps, * @caps: capabilities to query * @ostype: OS type to search for * @arch: architecture to search for + * @domain: domain type to search for * * Returns the first machine variant associated with - * the requested operating system type and architecture + * the requested operating system type, architecture + * and domain type */ extern const char * virCapabilitiesDefaultGuestMachine(virCapsPtr caps, const char *ostype, - const char *arch) + const char *arch, + const char *domain) { int i; + for (i = 0 ; i < caps->nguests ; i++) { - if (STREQ(caps->guests[i]->ostype, ostype) && - STREQ(caps->guests[i]->arch.name, arch) && - caps->guests[i]->arch.defaultInfo.nmachines) + virCapsGuestPtr guest = caps->guests[i]; + int j; + + if (!STREQ(guest->ostype, ostype) || !STREQ(guest->arch.name, arch)) + continue; + + for (j = 0; j < guest->arch.ndomains; j++) { + virCapsGuestDomainPtr dom= guest->arch.domains[j]; + + if (!STREQ(dom->type, domain)) + continue; + + if (!dom->info.nmachines) + break; + + return dom->info.machines[0]->name; + } + + if (guest->arch.defaultInfo.nmachines) return caps->guests[i]->arch.defaultInfo.machines[0]->name; } + return NULL; } diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index b958d95045..2f24605b55 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -207,7 +207,8 @@ virCapabilitiesDefaultGuestArch(virCapsPtr caps, extern const char * virCapabilitiesDefaultGuestMachine(virCapsPtr caps, const char *ostype, - const char *arch); + const char *arch, + const char *domain); extern const char * virCapabilitiesDefaultGuestEmulator(virCapsPtr caps, const char *ostype, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 87e05c28fc..f50a8ef4a4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2669,7 +2669,8 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn, if (!def->os.machine) { const char *defaultMachine = virCapabilitiesDefaultGuestMachine(caps, def->os.type, - def->os.arch); + def->os.arch, + virDomainVirtTypeToString(def->virtType)); if (defaultMachine != NULL) { if (!(def->os.machine = strdup(defaultMachine))) { virReportOOMError(conn); diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index 9c78f0defb..ebbaae89f9 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -720,7 +720,8 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { defaultMachine = virCapabilitiesDefaultGuestMachine(priv->caps, def->os.type, - def->os.arch); + def->os.arch, + virDomainVirtTypeToString(def->virtType)); if (defaultMachine != NULL) { if (!(def->os.machine = strdup(defaultMachine))) goto no_memory; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.xml index 6f6224375a..a2c6254151 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.xml @@ -1,11 +1,11 @@ - + QEMUGuest1 c7a5fdbd-edaf-9455-926a-d65c16db1809 219200 219200 1 - hvm + hvm