[libvirt] [PATCH 5/5] Utilize virDomainDiskAuth for storage pools

John Ferlan jferlan at redhat.com
Fri Jun 27 15:11:42 UTC 2014


Replace the authType, chap, and cephx unions in virStoragePoolSource
with a single pointer to a virStorageAuthDefPtr.  Adjust all users of
the previous chap/cephx and secret unions with the source->auth data.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/conf/storage_conf.c             | 152 +++++-------------------------------
 src/conf/storage_conf.h             |  38 +--------
 src/qemu/qemu_conf.c                |  46 ++---------
 src/storage/storage_backend_iscsi.c |  41 +++++-----
 src/storage/storage_backend_rbd.c   |  65 ++++++++-------
 5 files changed, 80 insertions(+), 262 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 8b6fd79..5b152f1 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -44,9 +44,12 @@
 #include "viralloc.h"
 #include "virfile.h"
 #include "virstring.h"
+#include "virlog.h"
 
 #define VIR_FROM_THIS VIR_FROM_STORAGE
 
+VIR_LOG_INIT("conf.storage_conf");
+
 #define DEFAULT_POOL_PERM_MODE 0755
 #define DEFAULT_VOL_PERM_MODE  0600
 
@@ -98,10 +101,6 @@ VIR_ENUM_IMPL(virStoragePoolSourceAdapter,
               VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST,
               "default", "scsi_host", "fc_host")
 
-VIR_ENUM_IMPL(virStoragePoolAuth,
-              VIR_STORAGE_POOL_AUTH_LAST,
-              "none", "chap", "ceph")
-
 typedef const char *(*virStorageVolFormatToString)(int format);
 typedef int (*virStorageVolFormatFromString)(const char *format);
 typedef const char *(*virStorageVolFeatureToString)(int feature);
@@ -374,18 +373,9 @@ virStoragePoolSourceClear(virStoragePoolSourcePtr source)
     VIR_FREE(source->name);
     virStoragePoolSourceAdapterClear(source->adapter);
     VIR_FREE(source->initiator.iqn);
+    virStorageAuthDefFree(source->auth);
     VIR_FREE(source->vendor);
     VIR_FREE(source->product);
-
-    if (source->authType == VIR_STORAGE_POOL_AUTH_CHAP) {
-        VIR_FREE(source->auth.chap.username);
-        VIR_FREE(source->auth.chap.secret.usage);
-    }
-
-    if (source->authType == VIR_STORAGE_POOL_AUTH_CEPHX) {
-        VIR_FREE(source->auth.cephx.username);
-        VIR_FREE(source->auth.cephx.secret.usage);
-    }
 }
 
 void
@@ -462,106 +452,17 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
 }
 
 static int
-virStoragePoolDefParseAuthSecret(xmlXPathContextPtr ctxt,
-                                 virStoragePoolAuthSecretPtr secret)
-{
-    char *uuid = NULL;
-    int ret = -1;
-
-    uuid = virXPathString("string(./auth/secret/@uuid)", ctxt);
-    secret->usage = virXPathString("string(./auth/secret/@usage)", ctxt);
-    if (uuid == NULL && secret->usage == NULL) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("missing auth secret uuid or usage attribute"));
-        return -1;
-    }
-
-    if (uuid != NULL) {
-        if (secret->usage != NULL) {
-            virReportError(VIR_ERR_XML_ERROR, "%s",
-                           _("either auth secret uuid or usage expected"));
-            goto cleanup;
-        }
-        if (virUUIDParse(uuid, secret->uuid) < 0) {
-            virReportError(VIR_ERR_XML_ERROR, "%s",
-                           _("invalid auth secret uuid"));
-            goto cleanup;
-        }
-        secret->uuidUsable = true;
-    } else {
-        secret->uuidUsable = false;
-    }
-
-    ret = 0;
- cleanup:
-    VIR_FREE(uuid);
-    return ret;
-}
-
-static int
-virStoragePoolDefParseAuth(xmlXPathContextPtr ctxt,
-                           virStoragePoolSourcePtr source)
-{
-    int ret = -1;
-    char *authType = NULL;
-    char *username = NULL;
-
-    authType = virXPathString("string(./auth/@type)", ctxt);
-    if (authType == NULL) {
-        source->authType = VIR_STORAGE_POOL_AUTH_NONE;
-        ret = 0;
-        goto cleanup;
-    }
-
-    if ((source->authType =
-         virStoragePoolAuthTypeFromString(authType)) < 0) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("unknown auth type '%s'"),
-                       authType);
-        goto cleanup;
-    }
-
-    username = virXPathString("string(./auth/@username)", ctxt);
-    if (username == NULL) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("missing auth username attribute"));
-        goto cleanup;
-    }
-
-    if (source->authType == VIR_STORAGE_POOL_AUTH_CHAP) {
-        source->auth.chap.username = username;
-        username = NULL;
-        if (virStoragePoolDefParseAuthSecret(ctxt,
-                                             &source->auth.chap.secret) < 0)
-            goto cleanup;
-    }
-    else if (source->authType == VIR_STORAGE_POOL_AUTH_CEPHX) {
-        source->auth.cephx.username = username;
-        username = NULL;
-        if (virStoragePoolDefParseAuthSecret(ctxt,
-                                             &source->auth.cephx.secret) < 0)
-            goto cleanup;
-    }
-
-    ret = 0;
-
- cleanup:
-    VIR_FREE(authType);
-    VIR_FREE(username);
-    return ret;
-}
-
-static int
 virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
                              virStoragePoolSourcePtr source,
                              int pool_type,
                              xmlNodePtr node)
 {
     int ret = -1;
-    xmlNodePtr relnode, *nodeset = NULL;
+    xmlNodePtr relnode, authnode, *nodeset = NULL;
     int nsource;
     size_t i;
     virStoragePoolOptionsPtr options;
+    virStorageAuthDefPtr authdef = NULL;
     char *name = NULL;
     char *port = NULL;
     char *adapter_type = NULL;
@@ -705,8 +606,18 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
                 VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST;
     }
 
-    if (virStoragePoolDefParseAuth(ctxt, source) < 0)
-        goto cleanup;
+    if ((authnode = virXPathNode("./auth", ctxt))) {
+        if (!(authdef = virStorageAuthDefParse(node->doc, authnode)))
+            goto cleanup;
+
+        if (authdef->authType == VIR_STORAGE_AUTH_TYPE_NONE) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("storage pool missing auth type"));
+            goto cleanup;
+        }
+
+        source->auth = authdef;
+    }
 
     source->vendor = virXPathString("string(./vendor/@name)", ctxt);
     source->product = virXPathString("string(./product/@name)", ctxt);
@@ -1057,7 +968,6 @@ virStoragePoolSourceFormat(virBufferPtr buf,
                            virStoragePoolSourcePtr src)
 {
     size_t i, j;
-    char uuid[VIR_UUID_STRING_BUFLEN];
 
     virBufferAddLit(buf, "<source>\n");
     virBufferAdjustIndent(buf, 2);
@@ -1138,29 +1048,9 @@ virStoragePoolSourceFormat(virBufferPtr buf,
         virBufferAsprintf(buf, "<format type='%s'/>\n", format);
     }
 
-    if (src->authType == VIR_STORAGE_POOL_AUTH_CHAP ||
-        src->authType == VIR_STORAGE_POOL_AUTH_CEPHX) {
-        virBufferAsprintf(buf, "<auth type='%s' ",
-                          virStoragePoolAuthTypeToString(src->authType));
-        virBufferEscapeString(buf, "username='%s'>\n",
-                              (src->authType == VIR_STORAGE_POOL_AUTH_CHAP ?
-                               src->auth.chap.username :
-                               src->auth.cephx.username));
-        virBufferAdjustIndent(buf, 2);
-
-        virBufferAddLit(buf, "<secret");
-        if (src->auth.cephx.secret.uuidUsable) {
-            virUUIDFormat(src->auth.cephx.secret.uuid, uuid);
-            virBufferAsprintf(buf, " uuid='%s'", uuid);
-        }
-
-        if (src->auth.cephx.secret.usage != NULL) {
-            virBufferAsprintf(buf, " usage='%s'", src->auth.cephx.secret.usage);
-        }
-        virBufferAddLit(buf, "/>\n");
-
-        virBufferAdjustIndent(buf, -2);
-        virBufferAddLit(buf, "</auth>\n");
+    if (src->auth) {
+        if (virStorageAuthDefFormat(buf, src->auth) < 0)
+            return -1;
     }
 
     virBufferEscapeString(buf, "<vendor name='%s'/>\n", src->vendor);
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 04d99eb..47f769b 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -106,37 +106,6 @@ typedef enum {
 } virStoragePoolDeviceType;
 
 
-typedef enum {
-    VIR_STORAGE_POOL_AUTH_NONE,
-    VIR_STORAGE_POOL_AUTH_CHAP,
-    VIR_STORAGE_POOL_AUTH_CEPHX,
-
-    VIR_STORAGE_POOL_AUTH_LAST,
-} virStoragePoolAuthType;
-VIR_ENUM_DECL(virStoragePoolAuth)
-
-typedef struct _virStoragePoolAuthSecret virStoragePoolAuthSecret;
-typedef virStoragePoolAuthSecret *virStoragePoolAuthSecretPtr;
-struct _virStoragePoolAuthSecret {
-    unsigned char uuid[VIR_UUID_BUFLEN];
-    char *usage;
-    bool uuidUsable;
-};
-
-typedef struct _virStoragePoolAuthChap virStoragePoolAuthChap;
-typedef virStoragePoolAuthChap *virStoragePoolAuthChapPtr;
-struct _virStoragePoolAuthChap {
-    char *username;
-    virStoragePoolAuthSecret secret;
-};
-
-typedef struct _virStoragePoolAuthCephx virStoragePoolAuthCephx;
-typedef virStoragePoolAuthCephx *virStoragePoolAuthCephxPtr;
-struct _virStoragePoolAuthCephx {
-    char *username;
-    virStoragePoolAuthSecret secret;
-};
-
 /*
  * For remote pools, info on how to reach the host
  */
@@ -243,11 +212,8 @@ struct _virStoragePoolSource {
     /* Initiator IQN */
     virStoragePoolSourceInitiatorAttr initiator;
 
-    int authType;       /* virStoragePoolAuthType */
-    union {
-        virStoragePoolAuthChap chap;
-        virStoragePoolAuthCephx cephx;
-    } auth;
+    /* Authentication information */
+    virStorageAuthDefPtr auth;
 
     /* Vendor of the source */
     char *vendor;
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 43af60e..f92f831 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1211,54 +1211,18 @@ qemuAddISCSIPoolSourceHost(virDomainDiskDefPtr def,
 
 static int
 qemuTranslateDiskSourcePoolAuth(virDomainDiskDefPtr def,
-                                virStoragePoolDefPtr pooldef)
+                                virStoragePoolSourcePtr source)
 {
     int ret = -1;
-    virStorageAuthDefPtr authdef;
 
     /* Only necessary when authentication set */
-    if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_NONE) {
+    if (!source->auth) {
         ret = 0;
         goto cleanup;
     }
-    if (VIR_ALLOC(def->src->auth) < 0)
+    def->src->auth = virStorageAuthDefCopy(source->auth);
+    if (!def->src->auth)
         goto cleanup;
-    authdef = def->src->auth;
-
-    /* Copy the authentication information from the storage pool
-     * into the virDomainDiskDef
-     */
-    if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_CHAP) {
-        if (VIR_STRDUP(authdef->username,
-                       pooldef->source.auth.chap.username) < 0)
-            goto cleanup;
-        if (pooldef->source.auth.chap.secret.uuidUsable) {
-            authdef->secretType = VIR_STORAGE_SECRET_TYPE_UUID;
-            memcpy(authdef->secret.uuid,
-                   pooldef->source.auth.chap.secret.uuid,
-                   VIR_UUID_BUFLEN);
-        } else {
-            if (VIR_STRDUP(authdef->secret.usage,
-                           pooldef->source.auth.chap.secret.usage) < 0)
-                goto cleanup;
-            authdef->secretType = VIR_STORAGE_SECRET_TYPE_USAGE;
-        }
-    } else if (pooldef->source.authType == VIR_STORAGE_POOL_AUTH_CEPHX) {
-        if (VIR_STRDUP(authdef->username,
-                       pooldef->source.auth.cephx.username) < 0)
-            goto cleanup;
-        if (pooldef->source.auth.cephx.secret.uuidUsable) {
-            authdef->secretType = VIR_STORAGE_SECRET_TYPE_UUID;
-            memcpy(authdef->secret.uuid,
-                   pooldef->source.auth.cephx.secret.uuid,
-                   VIR_UUID_BUFLEN);
-        } else {
-            if (VIR_STRDUP(authdef->secret.usage,
-                           pooldef->source.auth.cephx.secret.usage) < 0)
-                goto cleanup;
-            authdef->secretType = VIR_STORAGE_SECRET_TYPE_USAGE;
-        }
-    }
     ret = 0;
 
  cleanup:
@@ -1387,7 +1351,7 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
            def->src->srcpool->actualtype = VIR_STORAGE_TYPE_NETWORK;
            def->src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
 
-           if (qemuTranslateDiskSourcePoolAuth(def, pooldef) < 0)
+           if (qemuTranslateDiskSourcePoolAuth(def, &pooldef->source) < 0)
                goto cleanup;
 
            if (qemuAddISCSIPoolSourceHost(def, pooldef) < 0)
diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c
index aa6980c..3aac9d3 100644
--- a/src/storage/storage_backend_iscsi.c
+++ b/src/storage/storage_backend_iscsi.c
@@ -278,18 +278,20 @@ virStorageBackendISCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
 static int
 virStorageBackendISCSISetAuth(const char *portal,
                               virConnectPtr conn,
-                              virStoragePoolDefPtr def)
+                              virStoragePoolSourcePtr source)
 {
     virSecretPtr secret = NULL;
     unsigned char *secret_value = NULL;
-    virStoragePoolAuthChap chap;
+    virStorageAuthDefPtr authdef = source->auth;
     int ret = -1;
     char uuidStr[VIR_UUID_STRING_BUFLEN];
 
-    if (def->source.authType == VIR_STORAGE_POOL_AUTH_NONE)
+    if (!authdef || authdef->authType == VIR_STORAGE_AUTH_TYPE_NONE)
         return 0;
 
-    if (def->source.authType != VIR_STORAGE_POOL_AUTH_CHAP) {
+    VIR_DEBUG("username='%s' authType=%d secretType=%d",
+              authdef->username, authdef->authType, authdef->secretType);
+    if (authdef->authType != VIR_STORAGE_AUTH_TYPE_CHAP) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("iscsi pool only supports 'chap' auth type"));
         return -1;
@@ -302,12 +304,11 @@ virStorageBackendISCSISetAuth(const char *portal,
         return -1;
     }
 
-    chap = def->source.auth.chap;
-    if (chap.secret.uuidUsable)
-        secret = virSecretLookupByUUID(conn, chap.secret.uuid);
+    if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID)
+        secret = virSecretLookupByUUID(conn, authdef->secret.uuid);
     else
         secret = virSecretLookupByUsage(conn, VIR_SECRET_USAGE_TYPE_ISCSI,
-                                        chap.secret.usage);
+                                        authdef->secret.usage);
 
     if (secret) {
         size_t secret_size;
@@ -315,44 +316,44 @@ virStorageBackendISCSISetAuth(const char *portal,
             conn->secretDriver->secretGetValue(secret, &secret_size, 0,
                                                VIR_SECRET_GET_VALUE_INTERNAL_CALL);
         if (!secret_value) {
-            if (chap.secret.uuidUsable) {
-                virUUIDFormat(chap.secret.uuid, uuidStr);
+            if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
+                virUUIDFormat(authdef->secret.uuid, uuidStr);
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("could not get the value of the secret "
                                  "for username %s using uuid '%s'"),
-                               chap.username, uuidStr);
+                               authdef->username, uuidStr);
             } else {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("could not get the value of the secret "
                                  "for username %s using usage value '%s'"),
-                               chap.username, chap.secret.usage);
+                               authdef->username, authdef->secret.usage);
             }
             goto cleanup;
         }
     } else {
-        if (chap.secret.uuidUsable) {
-            virUUIDFormat(chap.secret.uuid, uuidStr);
+        if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
+            virUUIDFormat(authdef->secret.uuid, uuidStr);
             virReportError(VIR_ERR_NO_SECRET,
                            _("no secret matches uuid '%s'"),
                            uuidStr);
         } else {
             virReportError(VIR_ERR_NO_SECRET,
                            _("no secret matches usage value '%s'"),
-                           chap.secret.usage);
+                           authdef->secret.usage);
         }
         goto cleanup;
     }
 
     if (virISCSINodeUpdate(portal,
-                           def->source.devices[0].path,
+                           source->devices[0].path,
                            "node.session.auth.authmethod",
                            "CHAP") < 0 ||
         virISCSINodeUpdate(portal,
-                           def->source.devices[0].path,
+                           source->devices[0].path,
                            "node.session.auth.username",
-                           chap.username) < 0 ||
+                           authdef->username) < 0 ||
         virISCSINodeUpdate(portal,
-                           def->source.devices[0].path,
+                           source->devices[0].path,
                            "node.session.auth.password",
                            (const char *)secret_value) < 0)
         goto cleanup;
@@ -404,7 +405,7 @@ virStorageBackendISCSIStartPool(virConnectPtr conn,
                                 NULL, NULL) < 0)
             goto cleanup;
 
-        if (virStorageBackendISCSISetAuth(portal, conn, pool->def) < 0)
+        if (virStorageBackendISCSISetAuth(portal, conn, &pool->def->source) < 0)
             goto cleanup;
 
         if (virISCSIConnectionLogin(portal,
diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c
index 5d4ef79..a582743 100644
--- a/src/storage/storage_backend_rbd.c
+++ b/src/storage/storage_backend_rbd.c
@@ -50,10 +50,11 @@ typedef virStorageBackendRBDState *virStorageBackendRBDStatePtr;
 
 static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
                                              virConnectPtr conn,
-                                             virStoragePoolObjPtr pool)
+                                             virStoragePoolSourcePtr source)
 {
     int ret = -1;
     int r = 0;
+    virStorageAuthDefPtr authdef = source->auth;
     unsigned char *secret_value = NULL;
     size_t secret_value_size;
     char *rados_key = NULL;
@@ -66,12 +67,9 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     const char *mon_op_timeout = "30";
     const char *osd_op_timeout = "30";
 
-    VIR_DEBUG("Found Cephx username: %s",
-              pool->def->source.auth.cephx.username);
-
-    if (pool->def->source.auth.cephx.username != NULL) {
-        VIR_DEBUG("Using cephx authorization");
-        r = rados_create(&ptr->cluster, pool->def->source.auth.cephx.username);
+    if (authdef) {
+        VIR_DEBUG("Using cephx authorization, username: %s", authdef->username);
+        r = rados_create(&ptr->cluster, authdef->username);
         if (r < 0) {
             virReportSystemError(-r, "%s", _("failed to initialize RADOS"));
             goto cleanup;
@@ -84,46 +82,45 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
             return -1;
         }
 
-        if (pool->def->source.auth.cephx.secret.uuidUsable) {
-            virUUIDFormat(pool->def->source.auth.cephx.secret.uuid, secretUuid);
+        if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
+            virUUIDFormat(authdef->secret.uuid, secretUuid);
             VIR_DEBUG("Looking up secret by UUID: %s", secretUuid);
             secret = virSecretLookupByUUIDString(conn, secretUuid);
-        } else if (pool->def->source.auth.cephx.secret.usage != NULL) {
+        } else if (authdef->secret.usage != NULL) {
             VIR_DEBUG("Looking up secret by usage: %s",
-                      pool->def->source.auth.cephx.secret.usage);
+                      authdef->secret.usage);
             secret = virSecretLookupByUsage(conn, VIR_SECRET_USAGE_TYPE_CEPH,
-                                            pool->def->source.auth.cephx.secret.usage);
+                                            authdef->secret.usage);
         }
 
         if (secret == NULL) {
-            if (pool->def->source.auth.cephx.secret.uuidUsable) {
+            if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
                 virReportError(VIR_ERR_NO_SECRET,
                                _("no secret matches uuid '%s'"),
                                  secretUuid);
             } else {
                 virReportError(VIR_ERR_NO_SECRET,
                                _("no secret matches usage value '%s'"),
-                                 pool->def->source.auth.cephx.secret.usage);
+                                 authdef->secret.usage);
             }
             goto cleanup;
         }
 
-        secret_value = conn->secretDriver->secretGetValue(secret, &secret_value_size, 0,
+        secret_value = conn->secretDriver->secretGetValue(secret,
+                                                          &secret_value_size, 0,
                                                           VIR_SECRET_GET_VALUE_INTERNAL_CALL);
 
         if (!secret_value) {
-            if (pool->def->source.auth.cephx.secret.uuidUsable) {
+            if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("could not get the value of the secret "
                                  "for username '%s' using uuid '%s'"),
-                               pool->def->source.auth.cephx.username,
-                               secretUuid);
+                               authdef->username, secretUuid);
             } else {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("could not get the value of the secret "
                                  "for username '%s' using usage value '%s'"),
-                               pool->def->source.auth.cephx.username,
-                               pool->def->source.auth.cephx.secret.usage);
+                               authdef->username, authdef->secret.usage);
             }
             goto cleanup;
         }
@@ -170,18 +167,18 @@ static int virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     }
 
     VIR_DEBUG("Found %zu RADOS cluster monitors in the pool configuration",
-              pool->def->source.nhost);
+              source->nhost);
 
-    for (i = 0; i < pool->def->source.nhost; i++) {
-        if (pool->def->source.hosts[i].name != NULL &&
-            !pool->def->source.hosts[i].port) {
+    for (i = 0; i < source->nhost; i++) {
+        if (source->hosts[i].name != NULL &&
+            !source->hosts[i].port) {
             virBufferAsprintf(&mon_host, "%s:6789,",
-                              pool->def->source.hosts[i].name);
-        } else if (pool->def->source.hosts[i].name != NULL &&
-            pool->def->source.hosts[i].port) {
+                              source->hosts[i].name);
+        } else if (source->hosts[i].name != NULL &&
+            source->hosts[i].port) {
             virBufferAsprintf(&mon_host, "%s:%d,",
-                              pool->def->source.hosts[i].name,
-                              pool->def->source.hosts[i].port);
+                              source->hosts[i].name,
+                              source->hosts[i].port);
         } else {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("received malformed monitor, check the XML definition"));
@@ -335,7 +332,7 @@ static int virStorageBackendRBDRefreshPool(virConnectPtr conn,
     ptr.cluster = NULL;
     ptr.ioctx = NULL;
 
-    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) {
+    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) {
         goto cleanup;
     }
 
@@ -437,7 +434,7 @@ static int virStorageBackendRBDDeleteVol(virConnectPtr conn,
         VIR_WARN("%s", _("This storage backend does not supported zeroed removal of volumes"));
     }
 
-    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) {
+    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) {
         goto cleanup;
     }
 
@@ -520,7 +517,7 @@ virStorageBackendRBDBuildVol(virConnectPtr conn,
 
     virCheckFlags(0, -1);
 
-    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0)
+    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0)
         goto cleanup;
 
     if (virStorageBackendRBDOpenIoCTX(&ptr, pool) < 0)
@@ -560,7 +557,7 @@ static int virStorageBackendRBDRefreshVol(virConnectPtr conn,
     ptr.ioctx = NULL;
     int ret = -1;
 
-    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) {
+    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) {
         goto cleanup;
     }
 
@@ -594,7 +591,7 @@ static int virStorageBackendRBDResizeVol(virConnectPtr conn ATTRIBUTE_UNUSED,
 
     virCheckFlags(0, -1);
 
-    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, pool) < 0) {
+    if (virStorageBackendRBDOpenRADOSConn(&ptr, conn, &pool->def->source) < 0) {
         goto cleanup;
     }
 
-- 
1.9.3




More information about the libvir-list mailing list