Rather than picking apart the two pieces we need/want (path, hosts,
and auth)- let's just use the new virDomainDiskStorageSourceNew API
in order to allocate and use a virStorageSourcePtr.

The end result is that qemuBuildSCSIiSCSIHostdevDrvStr doesn't need
to "fake" one for the qemuBuildNetworkDriveStr call.

Signed-off-by: John Ferlan <jfer...@redhat.com>
---
 src/conf/domain_conf.c  | 71 ++++++++++++++++++++++++++++---------------------
 src/conf/domain_conf.h  |  5 +---
 src/qemu/qemu_command.c | 10 +------
 src/qemu/qemu_domain.c  |  8 +++---
 src/qemu/qemu_hotplug.c |  2 +-
 5 files changed, 47 insertions(+), 49 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c2be9b7155..c9a0628001 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2497,10 +2497,9 @@ 
virDomainHostdevSubsysSCSIiSCSIClear(virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc
 {
     if (!iscsisrc)
         return;
-    VIR_FREE(iscsisrc->path);
-    virStorageNetHostDefFree(iscsisrc->nhosts, iscsisrc->hosts);
-    virStorageAuthDefFree(iscsisrc->auth);
-    iscsisrc->auth = NULL;
+
+    virStorageSourceFree(iscsisrc->src);
+    iscsisrc->src = NULL;
 }
 
 
@@ -4373,7 +4372,7 @@ virDomainHostdevDefPostParse(virDomainHostdevDefPtr dev,
         if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
             virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
 
-            if (virDomainPostParseCheckISCSIPath(&iscsisrc->path) < 0)
+            if (virDomainPostParseCheckISCSIPath(&iscsisrc->src->path) < 0)
                 return -1;
         }
 
@@ -6915,7 +6914,8 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr 
sourcenode,
 }
 
 static int
-virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr sourcenode,
+virDomainHostdevSubsysSCSIiSCSIDefParseXML(virDomainXMLOptionPtr xmlopt,
+                                           xmlNodePtr sourcenode,
                                            virDomainHostdevSubsysSCSIPtr def)
 {
     int ret = -1;
@@ -6924,24 +6924,29 @@ virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr 
sourcenode,
     virStorageAuthDefPtr authdef = NULL;
     virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &def->u.iscsi;
 
-    /* Similar to virDomainDiskSourceParse for a VIR_STORAGE_TYPE_NETWORK */
+    /* For the purposes of command line creation, this needs to look
+     * like a disk storage source */
+    if (!(iscsisrc->src = virDomainDiskStorageSourceNew(xmlopt)))
+        return -1;
+    iscsisrc->src->type = VIR_STORAGE_TYPE_NETWORK;
+    iscsisrc->src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
 
-    if (!(iscsisrc->path = virXMLPropString(sourcenode, "name"))) {
+    if (!(iscsisrc->src->path = virXMLPropString(sourcenode, "name"))) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing iSCSI hostdev source path name"));
         goto cleanup;
     }
 
-    if (virDomainStorageNetworkParseHosts(sourcenode, &iscsisrc->hosts,
-                                          &iscsisrc->nhosts) < 0)
+    if (virDomainStorageNetworkParseHosts(sourcenode, &iscsisrc->src->hosts,
+                                          &iscsisrc->src->nhosts) < 0)
         goto cleanup;
 
-    if (iscsisrc->nhosts < 1) {
+    if (iscsisrc->src->nhosts < 1) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing the host address for the iSCSI hostdev"));
         goto cleanup;
     }
-    if (iscsisrc->nhosts > 1) {
+    if (iscsisrc->src->nhosts > 1) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("only one source host address may be specified "
                          "for the iSCSI hostdev"));
@@ -6967,7 +6972,7 @@ virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr 
sourcenode,
                                authdef->secrettype);
                 goto cleanup;
             }
-            iscsisrc->auth = authdef;
+            iscsisrc->src->auth = authdef;
             authdef = NULL;
         }
         cur = cur->next;
@@ -6980,7 +6985,8 @@ virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr 
sourcenode,
 }
 
 static int
-virDomainHostdevSubsysSCSIDefParseXML(xmlNodePtr sourcenode,
+virDomainHostdevSubsysSCSIDefParseXML(virDomainXMLOptionPtr xmlopt,
+                                      xmlNodePtr sourcenode,
                                       virDomainHostdevSubsysSCSIPtr scsisrc)
 {
     char *protocol = NULL;
@@ -6998,7 +7004,8 @@ virDomainHostdevSubsysSCSIDefParseXML(xmlNodePtr 
sourcenode,
     }
 
     if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
-        ret = virDomainHostdevSubsysSCSIiSCSIDefParseXML(sourcenode, scsisrc);
+        ret = virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlopt, sourcenode,
+                                                         scsisrc);
     else
         ret = virDomainHostdevSubsysSCSIHostDefParseXML(sourcenode, scsisrc);
 
@@ -7099,7 +7106,8 @@ 
virDomainHostdevSubsysMediatedDevDefParseXML(virDomainHostdevDefPtr def,
 }
 
 static int
-virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
+virDomainHostdevDefParseXMLSubsys(virDomainXMLOptionPtr xmlopt,
+                                  xmlNodePtr node,
                                   xmlXPathContextPtr ctxt,
                                   const char *type,
                                   virDomainHostdevDefPtr def,
@@ -7243,7 +7251,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
         break;
 
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
-        if (virDomainHostdevSubsysSCSIDefParseXML(sourcenode, scsisrc) < 0)
+        if (virDomainHostdevSubsysSCSIDefParseXML(xmlopt, sourcenode, scsisrc) 
< 0)
             goto error;
         break;
 
@@ -10164,7 +10172,8 @@ virDomainFSDefParseXML(xmlNodePtr node,
 }
 
 static int
-virDomainActualNetDefParseXML(xmlNodePtr node,
+virDomainActualNetDefParseXML(virDomainXMLOptionPtr xmlopt,
+                              xmlNodePtr node,
                               xmlXPathContextPtr ctxt,
                               virDomainNetDefPtr parent,
                               virDomainActualNetDefPtr *def,
@@ -10274,7 +10283,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
             VIR_STRDUP(addrtype, "usb") < 0)
             goto error;
         hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
-        if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+        if (virDomainHostdevDefParseXMLSubsys(xmlopt, node, ctxt, addrtype,
                                               hostdev, flags) < 0) {
             goto error;
         }
@@ -10607,7 +10616,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                        (flags & VIR_DOMAIN_DEF_PARSE_ACTUAL_NET) &&
                        def->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
                        virXMLNodeNameEqual(cur, "actual")) {
-                if (virDomainActualNetDefParseXML(cur, ctxt, def,
+                if (virDomainActualNetDefParseXML(xmlopt, cur, ctxt, def,
                                                   &actual, flags) < 0) {
                     goto error;
                 }
@@ -10868,7 +10877,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
             VIR_STRDUP(addrtype, "usb") < 0)
             goto error;
         hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
-        if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+        if (virDomainHostdevDefParseXMLSubsys(xmlopt, node, ctxt, addrtype,
                                               hostdev, flags) < 0) {
             goto error;
         }
@@ -14466,7 +14475,7 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr 
xmlopt,
     switch (def->mode) {
     case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
         /* parse managed/mode/type, and the <source> element */
-        if (virDomainHostdevDefParseXMLSubsys(node, ctxt, type, def, flags) < 
0)
+        if (virDomainHostdevDefParseXMLSubsys(xmlopt, node, ctxt, type, def, 
flags) < 0)
             goto error;
         break;
     case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES:
@@ -15440,9 +15449,9 @@ 
virDomainHostdevMatchSubsysSCSIiSCSI(virDomainHostdevDefPtr first,
     virDomainHostdevSubsysSCSIiSCSIPtr second_iscsisrc =
         &second->source.subsys.u.scsi.u.iscsi;
 
-    if (STREQ(first_iscsisrc->hosts[0].name, second_iscsisrc->hosts[0].name) &&
-        first_iscsisrc->hosts[0].port == second_iscsisrc->hosts[0].port &&
-        STREQ(first_iscsisrc->path, second_iscsisrc->path))
+    if (STREQ(first_iscsisrc->src->hosts[0].name, 
second_iscsisrc->src->hosts[0].name) &&
+        first_iscsisrc->src->hosts[0].port == 
second_iscsisrc->src->hosts[0].port &&
+        STREQ(first_iscsisrc->src->path, second_iscsisrc->src->path))
         return 1;
     return 0;
 }
@@ -22750,7 +22759,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
             virDomainHostdevSubsysSCSIProtocolTypeToString(scsisrc->protocol);
 
         virBufferAsprintf(buf, " protocol='%s' name='%s'",
-                          protocol, iscsisrc->path);
+                          protocol, iscsisrc->src->path);
     }
 
     if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST) {
@@ -22802,9 +22811,9 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
         if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
             virBufferAddLit(buf, "<host");
-            virBufferEscapeString(buf, " name='%s'", iscsisrc->hosts[0].name);
-            if (iscsisrc->hosts[0].port)
-                virBufferAsprintf(buf, " port='%u'", iscsisrc->hosts[0].port);
+            virBufferEscapeString(buf, " name='%s'", 
iscsisrc->src->hosts[0].name);
+            if (iscsisrc->src->hosts[0].port)
+                virBufferAsprintf(buf, " port='%u'", 
iscsisrc->src->hosts[0].port);
             virBufferAddLit(buf, "/>\n");
         } else {
             virBufferAsprintf(buf, "<adapter name='%s'/>\n",
@@ -22831,8 +22840,8 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
 
     if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
         scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI &&
-        iscsisrc->auth) {
-        if (virStorageAuthDefFormat(buf, iscsisrc->auth) < 0)
+        iscsisrc->src->auth) {
+        if (virStorageAuthDefFormat(buf, iscsisrc->src->auth) < 0)
             return -1;
     }
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index ca334e0147..dd3017e31b 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -357,10 +357,7 @@ struct _virDomainHostdevSubsysSCSIHost {
 typedef struct _virDomainHostdevSubsysSCSIiSCSI 
virDomainHostdevSubsysSCSIiSCSI;
 typedef virDomainHostdevSubsysSCSIiSCSI *virDomainHostdevSubsysSCSIiSCSIPtr;
 struct _virDomainHostdevSubsysSCSIiSCSI {
-    char *path;
-    size_t nhosts;
-    virStorageNetHostDefPtr hosts;
-    virStorageAuthDefPtr auth;
+    virStorageSourcePtr src;
 };
 
 typedef struct _virDomainHostdevSubsysSCSI virDomainHostdevSubsysSCSI;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 97c4890935..26a98bd7e9 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4952,21 +4952,13 @@ static char *
 qemuBuildSCSIiSCSIHostdevDrvStr(virDomainHostdevDefPtr dev)
 {
     char *source = NULL;
-    virStorageSource src;
     qemuDomainHostdevPrivatePtr hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev);
 
-    memset(&src, 0, sizeof(src));
-
     virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi;
     virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
 
-    src.protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
-    src.path = iscsisrc->path;
-    src.hosts = iscsisrc->hosts;
-    src.nhosts = iscsisrc->nhosts;
-
     /* Rather than pull what we think we want - use the network disk code */
-    source = qemuBuildNetworkDriveStr(&src, hostdevPriv->secinfo);
+    source = qemuBuildNetworkDriveStr(iscsisrc->src, hostdevPriv->secinfo);
 
     return source;
 }
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index ad8d484cb1..ecf78b426c 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1509,7 +1509,7 @@ qemuDomainSecretHostdevPrepare(virConnectPtr conn,
         virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
 
         if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI &&
-            iscsisrc->auth) {
+            iscsisrc->src->auth) {
 
             qemuDomainHostdevPrivatePtr hostdevPriv =
                 QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
@@ -1517,8 +1517,8 @@ qemuDomainSecretHostdevPrepare(virConnectPtr conn,
             if (!(hostdevPriv->secinfo =
                   qemuDomainSecretInfoNew(conn, priv, hostdev->info->alias,
                                           VIR_SECRET_USAGE_TYPE_ISCSI,
-                                          iscsisrc->auth->username,
-                                          &iscsisrc->auth->seclookupdef,
+                                          iscsisrc->src->auth->username,
+                                          &iscsisrc->src->auth->seclookupdef,
                                           false)))
                 return -1;
         }
@@ -8046,7 +8046,7 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
                 /* Follow qemuSetupDiskCgroup() and 
qemuSetImageCgroupInternal()
                  * which does nothing for non local storage
                  */
-                VIR_DEBUG("Not updating /dev for hostdev iSCSI path '%s'", 
iscsisrc->path);
+                VIR_DEBUG("Not updating /dev for hostdev iSCSI path '%s'", 
iscsisrc->src->path);
             } else {
                 virDomainHostdevSubsysSCSIHostPtr scsihostsrc = 
&scsisrc->u.host;
                 scsi = virSCSIDeviceNew(NULL,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 7cfe8f1bc6..1b5385d967 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5065,7 +5065,7 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
                 virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = 
&scsisrc->u.iscsi;
                 virReportError(VIR_ERR_OPERATION_FAILED,
                                _("host scsi iSCSI path %s not found"),
-                               iscsisrc->path);
+                               iscsisrc->src->path);
             } else {
                  virDomainHostdevSubsysSCSIHostPtr scsihostsrc =
                      &scsisrc->u.host;
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to