[libvirt] [PATCH] Using qemu with sheepdog pool

joel SIMOES joel.simoes at laposte.net
Wed Jan 22 15:21:52 UTC 2014


From: Joel SIMOES <joel.simoes at laposte.net>

---
 src/qemu/qemu_conf.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 65 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index ac53f6d..dfafcdc 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1185,6 +1185,56 @@ int qemuDriverAllocateID(virQEMUDriverPtr driver)
     return virAtomicIntInc(&driver->nextvmid);
 }
 
+
+static int
+qemuAddSheepPoolSourceHost(virDomainDiskDefPtr def,
+                           virStoragePoolDefPtr pooldef)
+{
+    int ret = -1;
+    char **tokens = NULL;
+
+    /* Only support one host */
+    if (pooldef->source.nhost != 1) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("Expected exactly 1 host for the storage pool"));
+        goto cleanup;
+    }
+
+    /* iscsi pool only supports one host */
+    def->nhosts = 1;
+
+    if (VIR_ALLOC_N(def->hosts, def->nhosts) < 0)
+        goto cleanup;
+
+    if (VIR_STRDUP(def->hosts[0].name, pooldef->source.hosts[0].name) < 0)
+        goto cleanup;
+
+    if (virAsprintf(&def->hosts[0].port, "%d",
+                    pooldef->source.hosts[0].port ?
+                    pooldef->source.hosts[0].port :
+                    7000) < 0)
+        goto cleanup;
+
+    
+
+    
+
+    /* Storage pool have not supported these 2 attributes yet,
+     * use the defaults.
+     */
+    def->hosts[0].transport = VIR_DOMAIN_DISK_PROTO_TRANS_TCP;
+    def->hosts[0].socket = NULL;
+
+    
+    def->protocol = VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG;
+
+    ret = 0;
+
+cleanup:
+    virStringFreeList(tokens);
+    return ret;
+}
+
 static int
 qemuAddISCSIPoolSourceHost(virDomainDiskDefPtr def,
                            virStoragePoolDefPtr pooldef)
@@ -1352,14 +1402,15 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
 
     def->srcpool->pooltype = pooldef->type;
     def->srcpool->voltype = info.type;
-
-    if (def->srcpool->mode && pooldef->type != VIR_STORAGE_POOL_ISCSI) {
+    
+    if (def->srcpool->mode && pooldef->type != VIR_STORAGE_POOL_ISCSI && !(def->srcpool->mode == VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT && pooldef->type == VIR_STORAGE_POOL_SHEEPDOG) ) {
+     
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("disk source mode is only valid when "
-                         "storage pool is of iscsi type"));
+                         "storage pool is of iscsi type or only direct for sheepdog "));
         goto cleanup;
     }
-
+    
     VIR_FREE(def->src);
     virDomainDiskHostDefFree(def->nhosts, def->hosts);
     virDomainDiskAuthClear(def);
@@ -1439,9 +1490,17 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
        }
        break;
 
-    case VIR_STORAGE_POOL_MPATH:
-    case VIR_STORAGE_POOL_RBD:
     case VIR_STORAGE_POOL_SHEEPDOG:
+        def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_NETWORK;
+        // force direct mode
+        def->srcpool->mode = VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT;
+        def->protocol = VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG;
+        def->src = virStorageVolGetPath(vol);
+                
+        qemuAddSheepPoolSourceHost(def, pooldef);
+        break;
+    case VIR_STORAGE_POOL_MPATH:
+    case VIR_STORAGE_POOL_RBD:        
     case VIR_STORAGE_POOL_GLUSTER:
     case VIR_STORAGE_POOL_LAST:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- 
1.8.3.2




More information about the libvir-list mailing list