diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 02ca509..8e2a7b6 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -344,7 +344,7 @@
disk
The disk element is the main container for describing - disks. The type attribute is either "file" or "block" + disks. The type attribute is either "file", "block" or "pool" and refers to the underlying source for the disk. The optional device attribute indicates how the disk is to be exposed to the guest OS. Possible values for this attribute are "floppy", "disk" @@ -354,7 +354,11 @@
If the disk type is "file", then the file attribute specifies the fully-qualified path to the file holding the disk. If the disk type is "block", then the dev attribute specifies - the path to the host device to serve as the disk. Since 0.0.3
+ the path to the host device to serve as the disk. If the disk type + is "pool", then the pool and volume specify the + virtual location of the disk, the path is automatically resolved if the pool + and the volume exist. + Since 0.0.3
target
The target element controls the bus / device under which the disk is exposed to the guest OS. The dev attribute indicates diff --git a/src/xml.c b/src/xml.c index 22dc211..598bfb3 100644 --- a/src/xml.c +++ b/src/xml.c @@ -1300,6 +1300,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, typ = 0; else if (xmlStrEqual(type, BAD_CAST "block")) typ = 1; + else if (xmlStrEqual(type, BAD_CAST "pool")) + typ = 2; xmlFree(type); } device = xmlGetProp(node, BAD_CAST "device"); @@ -1309,11 +1311,32 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, if (cur->type == XML_ELEMENT_NODE) { if ((source == NULL) && (xmlStrEqual(cur->name, BAD_CAST "source"))) { - if (typ == 0) source = xmlGetProp(cur, BAD_CAST "file"); - else + else if (typ == 1) source = xmlGetProp(cur, BAD_CAST "dev"); + else if (typ == 2) { + xmlChar *pool = xmlGetProp(cur, BAD_CAST "pool"); + xmlChar *volume = xmlGetProp(cur, BAD_CAST "volume"); + if (pool != NULL && volume != NULL) { + virStoragePoolPtr virPool; + virPool = virStoragePoolLookupByName(conn, (const char *) pool); + if (virPool != NULL) { + virStorageVolPtr virVol; + virVol = virStorageVolLookupByName(virPool, (const char *) volume); + if (virVol != NULL) { + virStorageVolInfo info; + if (virStorageVolGetInfo(virVol, &info) == 0) { + source = BAD_CAST virStorageVolGetPath(virVol); + /* We set the type to the 'native' type */ + typ = info.type; + } + } + } + } + xmlFree(pool); + xmlFree(volume); + } } else if ((target == NULL) && (xmlStrEqual(cur->name, BAD_CAST "target"))) { target = xmlGetProp(cur, BAD_CAST "dev"); @@ -1411,7 +1434,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferVSprintf(buf, "(uname 'phy:%s')", source); else virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", source); - } + } } if (ro == 1) virBufferAddLit(buf, "(mode 'r')");