[libvirt] Domain XML format using defined storage volume + RFC

Stefan de Konink skinkie at xs4all.nl
Thu May 15 15:39:47 UTC 2008


I almost started crying why it didn't work. But it is fixed, and it works
as a charm :) See updated patch!

Sign-off-by: Stefan de Konink <dekonink at kinkrsoftware.nl>


Stefan

ps. One extra suggestion: I would consider it a good thing if the virLog
function in util.c would get a \n
-------------- next part --------------
diff --git a/src/xml.c b/src/xml.c
index 22dc211..9fd093e 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,24 @@ 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)
+                                source = BAD_CAST virStorageVolGetPath(virVol);
+                        }
+                    }
+                }
             } else if ((target == NULL) &&
                        (xmlStrEqual(cur->name, BAD_CAST "target"))) {
                 target = xmlGetProp(cur, BAD_CAST "dev");
@@ -1411,7 +1426,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
                 virBufferVSprintf(buf, "(uname 'phy:%s')", source);
             else
                 virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", source);
-        }
+        } else if (typ == 2)
+            virBufferVSprintf(buf, "(uname 'phy:%s')", source);
     }
     if (ro == 1)
         virBufferAddLit(buf, "(mode 'r')");


More information about the libvir-list mailing list