Add an optional unique_id parameter to nodedev. Allows for easier lookup and display of the unique_id value in order to document for use with scsi_host code. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- docs/formatnode.html.in | 11 +++++++++++ docs/schemas/nodedev.rng | 6 ++++++ src/conf/node_device_conf.c | 23 ++++++++++++++++------ src/conf/node_device_conf.h | 1 + src/node_device/node_device_linux_sysfs.c | 6 ++++++ src/test/test_driver.c | 5 +++-- .../pci_8086_27c5_scsi_host_0_unique_id.xml | 8 ++++++++ tests/nodedevxml2xmltest.c | 1 + 8 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 tests/nodedevschemadata/pci_8086_27c5_scsi_host_0_unique_id.xml diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index 76bf8af..cdf0277 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -173,6 +173,17 @@ <dl> <dt><code>host</code></dt> <dd>The SCSI host number.</dd> + <dt><code>unique_id</code></dt> + <dd>On input, this optionally provides the value from the + 'unique_id' file found in the scsi_host's directory. To + view the values of all 'unique_id' files, use <code>find -H + /sys/class/scsi_host/host{0..9}/unique_id | + xargs grep '[0-9]'</code>. On output, if the unique_id + file exists, the value from the file will be displayed. + This can be used in order to help uniquely identify the + scsi_host adapter in a <a href="formatstorage.html"> + Storage Pool</a>. <span class="since">Since 1.2.6</span> + </dd> <dt><code>capability</code></dt> <dd>Current capabilities include "vports_ops" (indicates vport operations are supported) and "fc_host". "vport_ops" diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 02d4106..31319da 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -310,6 +310,12 @@ </element> <optional> + <element name='unique_id'> + <ref name='positiveInteger'/> + </element> + </optional> + + <optional> <zeroOrMore> <element name='capability'> <choice> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 99fa448..e73a9f4 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -399,6 +399,9 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def) case VIR_NODE_DEV_CAP_SCSI_HOST: virBufferAsprintf(&buf, "<host>%d</host>\n", data->scsi_host.host); + if (data->scsi_host.unique_id != -1) + virBufferAsprintf(&buf, "<unique_id>%d</unique_id>\n", + data->scsi_host.unique_id); if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) { virBufferAddLit(&buf, "<capability type='fc_host'>\n"); virBufferAdjustIndent(&buf, 2); @@ -788,12 +791,20 @@ virNodeDevCapSCSIHostParseXML(xmlXPathContextPtr ctxt, orignode = ctxt->node; ctxt->node = node; - if (create == EXISTING_DEVICE && - virNodeDevCapsDefParseULong("number(./host[1])", ctxt, - &data->scsi_host.host, def, - _("no SCSI host ID supplied for '%s'"), - _("invalid SCSI host ID supplied for '%s'")) < 0) { - goto out; + if (create == EXISTING_DEVICE) { + if (virNodeDevCapsDefParseULong("number(./host[1])", ctxt, + &data->scsi_host.host, def, + _("no SCSI host ID supplied for '%s'"), + _("invalid SCSI host ID supplied for '%s'")) < 0) { + goto out; + } + /* Optional unique_id value */ + data->scsi_host.unique_id = -1; + if (virNodeDevCapsDefParseIntOptional("number(./unique_id[1])", ctxt, + &data->scsi_host.unique_id, def, + _("invalid unique_id supplied for '%s'")) < 0) { + goto out; + } } if ((n = virXPathNodeSet("./capability", ctxt, &nodes)) < 0) { diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index 50ce4b3..e949d93 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -140,6 +140,7 @@ struct _virNodeDevCapsDef { } net; struct { unsigned int host; + int unique_id; char *wwnn; char *wwpn; char *fabric_wwn; diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c index 6d9726f..be95e51 100644 --- a/src/node_device/node_device_linux_sysfs.c +++ b/src/node_device/node_device_linux_sysfs.c @@ -47,6 +47,12 @@ detect_scsi_host_caps(union _virNodeDevCapData *d) char *vports = NULL; int ret = -1; + if (virReadSCSIUniqueId(NULL, d->scsi_host.host, + &d->scsi_host.unique_id) < 0) { + VIR_DEBUG("Failed to read unique_id for host%d", d->scsi_host.host); + d->scsi_host.unique_id = -1; + } + VIR_DEBUG("Checking if host%d is an FC HBA", d->scsi_host.host); if (virIsCapableFCHost(NULL, d->scsi_host.host)) { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index f9e2b3d..8fc2ff3 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6088,14 +6088,15 @@ testNodeDeviceCreateXML(virConnectPtr conn, if (VIR_STRDUP(def->name, wwpn) < 0) goto cleanup; - /* Fill in a random 'host' value, since this would also come from - * the backend */ + /* Fill in a random 'host' and 'unique_id' value, + * since this would also come from the backend */ caps = def->caps; while (caps) { if (caps->type != VIR_NODE_DEV_CAP_SCSI_HOST) continue; caps->data.scsi_host.host = virRandomBits(10); + caps->data.scsi_host.unique_id = 2; caps = caps->next; } diff --git a/tests/nodedevschemadata/pci_8086_27c5_scsi_host_0_unique_id.xml b/tests/nodedevschemadata/pci_8086_27c5_scsi_host_0_unique_id.xml new file mode 100644 index 0000000..5428f59 --- /dev/null +++ b/tests/nodedevschemadata/pci_8086_27c5_scsi_host_0_unique_id.xml @@ -0,0 +1,8 @@ +<device> + <name>pci_8086_27c5_scsi_host_0</name> + <parent>pci_8086_27c5</parent> + <capability type='scsi_host'> + <host>1</host> + <unique_id>2</unique_id> + </capability> +</device> diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c index 9390bf5..ea41d84 100644 --- a/tests/nodedevxml2xmltest.c +++ b/tests/nodedevxml2xmltest.c @@ -82,6 +82,7 @@ mymain(void) DO_TEST("pci_1002_71c4"); DO_TEST("pci_8086_10c9_sriov_pf"); DO_TEST("pci_8086_27c5_scsi_host_0"); + DO_TEST("pci_8086_27c5_scsi_host_0_unique_id"); DO_TEST("pci_8086_27c5_scsi_host_scsi_device_lun0"); DO_TEST("pci_8086_27c5_scsi_host_scsi_host"); DO_TEST("pci_8086_27c5_scsi_host"); -- 1.9.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list