>From f087f0656f882be305783e24d55921b57fbbcb97 Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Mon, 14 Jun 2010 16:08:55 +0100 Subject: [PATCH 09/10] Add ability to set a default driver name/type when parsing disks Record a default driver name/type in capabilities struct. Use this when parsing disks if value is not set in XML config. * src/conf/capabilities.h: Record default driver name/type for disks * src/conf/domain_conf.c: Fallback to default driver name/type when parsing disks * src/qemu/qemu_driver.c: Set default driver name/type to raw --- src/conf/capabilities.h | 2 ++ src/conf/domain_conf.c | 21 ++++++++++++++++++--- src/qemu/qemu_driver.c | 8 ++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) Index: libvirt-0.8.1/src/conf/capabilities.h =================================================================== --- libvirt-0.8.1.orig/src/conf/capabilities.h +++ libvirt-0.8.1/src/conf/capabilities.h @@ -120,6 +120,8 @@ struct _virCaps { virCapsGuestPtr *guests; unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN]; unsigned int emulatorRequired : 1; + const char *defaultDiskDriverName; + const char *defaultDiskDriverType; void *(*privateDataAllocFunc)(void); void (*privateDataFreeFunc)(void *); int (*privateDataXMLFormat)(virBufferPtr, void *); Index: libvirt-0.8.1/src/conf/domain_conf.c =================================================================== --- libvirt-0.8.1.orig/src/conf/domain_conf.c +++ libvirt-0.8.1/src/conf/domain_conf.c @@ -1366,7 +1366,8 @@ virDomainDiskDefAssignAddress(virDomainD * @param node XML nodeset to parse for disk definition */ static virDomainDiskDefPtr -virDomainDiskDefParseXML(xmlNodePtr node, +virDomainDiskDefParseXML(virCapsPtr caps, + xmlNodePtr node, int flags) { virDomainDiskDefPtr def; xmlNodePtr cur; @@ -1595,6 +1596,16 @@ virDomainDiskDefParseXML(xmlNodePtr node def->serial = serial; serial = NULL; + if (!def->driverType && + caps->defaultDiskDriverType && + !(def->driverType = strdup(caps->defaultDiskDriverType))) + goto no_memory; + + if (!def->driverName && + caps->defaultDiskDriverName && + !(def->driverName = strdup(caps->defaultDiskDriverName))) + goto no_memory; + if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && virDomainDiskDefAssignAddress(def) < 0) goto error; @@ -1615,6 +1626,9 @@ cleanup: return def; +no_memory: + virReportOOMError(); + error: virDomainDiskDefFree(def); def = NULL; @@ -3521,7 +3535,7 @@ virDomainDeviceDefPtr virDomainDeviceDef if (xmlStrEqual(node->name, BAD_CAST "disk")) { dev->type = VIR_DOMAIN_DEVICE_DISK; - if (!(dev->data.disk = virDomainDiskDefParseXML(node, flags))) + if (!(dev->data.disk = virDomainDiskDefParseXML(caps, node, flags))) goto error; } else if (xmlStrEqual(node->name, BAD_CAST "filesystem")) { dev->type = VIR_DOMAIN_DEVICE_FS; @@ -4028,7 +4042,8 @@ static virDomainDefPtr virDomainDefParse if (n && VIR_ALLOC_N(def->disks, n) < 0) goto no_memory; for (i = 0 ; i < n ; i++) { - virDomainDiskDefPtr disk = virDomainDiskDefParseXML(nodes[i], + virDomainDiskDefPtr disk = virDomainDiskDefParseXML(caps, + nodes[i], flags); if (!disk) goto error; Index: libvirt-0.8.1/src/qemu/qemu_driver.c =================================================================== --- libvirt-0.8.1.orig/src/qemu/qemu_driver.c +++ libvirt-0.8.1/src/qemu/qemu_driver.c @@ -1324,6 +1324,14 @@ qemuCreateCapabilities(virCapsPtr oldcap return NULL; } + if (driver->allowDiskFormatProbing) { + caps->defaultDiskDriverName = NULL; + caps->defaultDiskDriverType = NULL; + } else { + caps->defaultDiskDriverName = "qemu"; + caps->defaultDiskDriverType = "raw"; + } + /* Domain XML parser hooks */ caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc; caps->privateDataFreeFunc = qemuDomainObjPrivateFree;