[libvirt] [PATCH 1/1] Fix NPIV on older kernels.
Daniel Veillard
veillard at redhat.com
Fri Jun 19 16:15:03 UTC 2009
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 at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list