
On Fri, Jun 19, 2009 at 12:01:52PM -0400, David Allan wrote:
* src/node_device.c src/node_device_hal_linux.c: check in both /sys/class/fc_host/hostN and /sys/class/scsi_host/hostN for the vport operations files --- src/node_device.c | 23 ++++++++++++++++++++++- src/node_device_hal_linux.c | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 9 deletions(-)
diff --git a/src/node_device.c b/src/node_device.c index d01695d..8de6495 100644 --- a/src/node_device.c +++ b/src/node_device.c @@ -369,6 +369,7 @@ nodeDeviceVportCreateDelete(virConnectPtr conn, int operation) { int retval = 0; + struct stat st; char *operation_path = NULL, *vport_name = NULL; const char *operation_file = NULL;
@@ -388,7 +389,7 @@ nodeDeviceVportCreateDelete(virConnectPtr conn, }
if (virAsprintf(&operation_path, - "%shost%d%s", + "%s/host%d/%s", LINUX_SYSFS_FC_HOST_PREFIX, parent_host, operation_file) < 0) { @@ -398,6 +399,26 @@ nodeDeviceVportCreateDelete(virConnectPtr conn, goto cleanup; }
+ if (stat(operation_path, &st) != 0) { + VIR_FREE(operation_path); + if (virAsprintf(&operation_path, + "%s/host%d/%s", + LINUX_SYSFS_SCSI_HOST_PREFIX, + parent_host, + operation_file) < 0) { + + virReportOOMError(conn); + retval = -1; + goto cleanup; + } + + if (stat(operation_path, &st) != 0) { + VIR_ERROR(_("No vport operation path found for host%d"), parent_host); + retval = -1; + goto cleanup; + } + } + VIR_DEBUG(_("Vport operation path is '%s'"), operation_path);
if (virAsprintf(&vport_name, diff --git a/src/node_device_hal_linux.c b/src/node_device_hal_linux.c index b76235d..2de9afe 100644 --- a/src/node_device_hal_linux.c +++ b/src/node_device_hal_linux.c @@ -162,28 +162,51 @@ out:
int check_vport_capable_linux(union _virNodeDevCapData *d) { - char *sysfs_path = NULL; - struct stat st; int retval = 0; + char *operation_path = NULL; + struct stat st;
- if (virAsprintf(&sysfs_path, "%s/host%d/vport_create", + VIR_DEBUG(_("Checking if host%d is vport capable"), d->scsi_host.host); + + if (virAsprintf(&operation_path, + "%s/host%d/%s", LINUX_SYSFS_FC_HOST_PREFIX, - d->scsi_host.host) < 0) { + d->scsi_host.host, + LINUX_SYSFS_VPORT_CREATE_POSTFIX) < 0) { + virReportOOMError(NULL); retval = -1; goto out; }
- if (stat(sysfs_path, &st) != 0) { - /* Not a vport capable HBA; not an error, either. */ + if (stat(operation_path, &st) == 0) { + d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS; goto out; }
- d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS; + VIR_FREE(operation_path); + operation_path = NULL; + + if (virAsprintf(&operation_path, + "%s/host%d%s", + LINUX_SYSFS_SCSI_HOST_PREFIX, + d->scsi_host.host, + LINUX_SYSFS_VPORT_CREATE_POSTFIX) < 0) { + virReportOOMError(NULL); + retval = -1; + goto out; + } + + if (stat(operation_path, &st) == 0) { + d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS; + } else { + VIR_ERROR(_("No vport operation path found for host%d"), d->scsi_host.host); + }
out: - VIR_FREE(sysfs_path); + VIR_FREE(operation_path); return retval; }
#endif /* __linux__ */ +
Ah, not I can understand all the patch :-) Thanks for the quick feedback, ACK from me ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/