aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Allan <dallan@redhat.com>2009-11-12 23:03:47 +0100
committerDaniel Veillard <veillard@redhat.com>2009-11-12 23:03:47 +0100
commitdb19834a0a0c9f3f78e862df1ea7a57bca821187 (patch)
tree48a4ba40ba70f81f6ca49119e63b155e4ed72b68 /src/conf/node_device_conf.c
parentImplement a node device backend using libudev (diff)
downloadlibvirt-db19834a0a0c9f3f78e862df1ea7a57bca821187.tar.gz
libvirt-db19834a0a0c9f3f78e862df1ea7a57bca821187.tar.bz2
libvirt-db19834a0a0c9f3f78e862df1ea7a57bca821187.zip
Add scsi_target device type
* src/conf/node_device_conf.h src/conf/node_device_conf.c: add specific support for SCSI target in node device capabilities * src/node_device/node_device_udev.c: add some extra detection code when handling udev output
Diffstat (limited to 'src/conf/node_device_conf.c')
-rw-r--r--src/conf/node_device_conf.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 379787dbb..f55c9c76c 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -46,6 +46,7 @@ VIR_ENUM_IMPL(virNodeDevCap, VIR_NODE_DEV_CAP_LAST,
"usb",
"net",
"scsi_host",
+ "scsi_target",
"scsi",
"storage")
@@ -387,6 +388,12 @@ char *virNodeDeviceDefFormat(virConnectPtr conn,
}
break;
+
+ case VIR_NODE_DEV_CAP_SCSI_TARGET:
+ virBufferVSprintf(&buf, " <target>%s</target>\n",
+ data->scsi_target.name);
+ break;
+
case VIR_NODE_DEV_CAP_SCSI:
virBufferVSprintf(&buf, " <host>%d</host>\n", data->scsi.host);
virBufferVSprintf(&buf, " <bus>%d</bus>\n", data->scsi.bus);
@@ -660,6 +667,36 @@ out:
return ret;
}
+
+static int
+virNodeDevCapScsiTargetParseXML(virConnectPtr conn,
+ xmlXPathContextPtr ctxt,
+ virNodeDeviceDefPtr def,
+ xmlNodePtr node,
+ union _virNodeDevCapData *data)
+{
+ xmlNodePtr orignode;
+ int ret = -1;
+
+ orignode = ctxt->node;
+ ctxt->node = node;
+
+ data->scsi_target.name = virXPathString(conn, "string(./name[1])", ctxt);
+ if (!data->scsi_target.name) {
+ virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("no target name supplied for '%s'"),
+ def->name);
+ goto out;
+ }
+
+ ret = 0;
+
+out:
+ ctxt->node = orignode;
+ return ret;
+}
+
+
static int
virNodeDevCapScsiHostParseXML(virConnectPtr conn,
xmlXPathContextPtr ctxt,
@@ -1064,6 +1101,9 @@ virNodeDevCapsDefParseXML(virConnectPtr conn,
case VIR_NODE_DEV_CAP_SCSI_HOST:
ret = virNodeDevCapScsiHostParseXML(conn, ctxt, def, node, &caps->data, create);
break;
+ case VIR_NODE_DEV_CAP_SCSI_TARGET:
+ ret = virNodeDevCapScsiTargetParseXML(conn, ctxt, def, node, &caps->data);
+ break;
case VIR_NODE_DEV_CAP_SCSI:
ret = virNodeDevCapScsiParseXML(conn, ctxt, def, node, &caps->data);
break;
@@ -1387,6 +1427,9 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
VIR_FREE(data->scsi_host.wwnn);
VIR_FREE(data->scsi_host.wwpn);
break;
+ case VIR_NODE_DEV_CAP_SCSI_TARGET:
+ VIR_FREE(data->scsi_target.name);
+ break;
case VIR_NODE_DEV_CAP_SCSI:
VIR_FREE(data->scsi.type);
break;