* 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__ */ + -- 1.6.0.6 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list