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 <jferlan(a)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