[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