[libvirt] [PATCH 3/5] nodedev: Fix sysfs paths for vport operations
Dave Allan
dallan at redhat.com
Tue Aug 17 21:39:11 UTC 2010
On Tue, Aug 17, 2010 at 10:51:46PM +0200, Jiri Denemark wrote:
> From: Dave Allan <dallan at redhat.com>
>
> Some kernels, such as the one used in RHEL-5, have vport_create and
> vport_delete operation files in /sys/class/scsi_host/hostN directory
> instead of /sys/class/fc_host/hostN. Let's check both paths for
> compatibility reasons.
>
> This also removes unnecessary '/' characters from sysfs paths containing
> LINUX_SYSFS_FC_HOST_PREFIX.
> ---
> src/node_device/node_device_driver.c | 21 +++++++++++++++++++
> src/node_device/node_device_driver.h | 2 +-
> src/node_device/node_device_linux_sysfs.c | 31 +++++++++++++++++++++++-----
> 3 files changed, 47 insertions(+), 7 deletions(-)
>
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index b0ff662..a6ac80b 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -392,6 +392,7 @@ nodeDeviceVportCreateDelete(const int parent_host,
> int retval = 0;
> char *operation_path = NULL, *vport_name = NULL;
> const char *operation_file = NULL;
> + struct stat st;
>
> switch (operation) {
> case VPORT_CREATE:
> @@ -419,6 +420,26 @@ nodeDeviceVportCreateDelete(const int parent_host,
> goto cleanup;
> }
>
> + if (stat(operation_path, &st) != 0) {
> + VIR_FREE(operation_path);
> + if (virAsprintf(&operation_path,
> + "%shost%d%s",
> + LINUX_SYSFS_SCSI_HOST_PREFIX,
> + parent_host,
> + operation_file) < 0) {
> + virReportOOMError();
> + 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/node_device_driver.h b/src/node_device/node_device_driver.h
> index f233641..4721be4 100644
> --- a/src/node_device/node_device_driver.h
> +++ b/src/node_device/node_device_driver.h
> @@ -28,7 +28,7 @@
> # include "driver.h"
> # include "node_device_conf.h"
>
> -# define LINUX_SYSFS_SCSI_HOST_PREFIX "/sys/class/scsi_host"
> +# define LINUX_SYSFS_SCSI_HOST_PREFIX "/sys/class/scsi_host/"
> # define LINUX_SYSFS_SCSI_HOST_POSTFIX "device"
> # define LINUX_SYSFS_FC_HOST_PREFIX "/sys/class/fc_host/"
>
> diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c
> index c90e72b..7f09cc7 100644
> --- a/src/node_device/node_device_linux_sysfs.c
> +++ b/src/node_device/node_device_linux_sysfs.c
> @@ -119,7 +119,7 @@ int check_fc_host_linux(union _virNodeDevCapData *d)
>
> VIR_DEBUG("Checking if host%d is an FC HBA", d->scsi_host.host);
>
> - if (virAsprintf(&sysfs_path, "%s/host%d",
> + if (virAsprintf(&sysfs_path, "%shost%d",
> LINUX_SYSFS_FC_HOST_PREFIX,
> d->scsi_host.host) < 0) {
> virReportOOMError();
> @@ -167,20 +167,39 @@ int check_vport_capable_linux(union _virNodeDevCapData *d)
> struct stat st;
> int retval = 0;
>
> - if (virAsprintf(&sysfs_path, "%s/host%d/vport_create",
> + if (virAsprintf(&sysfs_path,
> + "%shost%d%s",
> LINUX_SYSFS_FC_HOST_PREFIX,
> - d->scsi_host.host) < 0) {
> + d->scsi_host.host,
> + LINUX_SYSFS_VPORT_CREATE_POSTFIX) < 0) {
> virReportOOMError();
> retval = -1;
> goto out;
> }
>
> - if (stat(sysfs_path, &st) != 0) {
> - /* Not a vport capable HBA; not an error, either. */
> + if (stat(sysfs_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(sysfs_path);
> + if (virAsprintf(&sysfs_path,
> + "%shost%d%s",
> + LINUX_SYSFS_SCSI_HOST_PREFIX,
> + d->scsi_host.host,
> + LINUX_SYSFS_VPORT_CREATE_POSTFIX) < 0) {
> + virReportOOMError();
> + retval = -1;
> + goto out;
> + }
> +
> + if (stat(sysfs_path, &st) == 0) {
> + d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS;
> + } else {
> + /* Not a vport capable HBA; not an error, either. */
> + VIR_DEBUG("No vport operation path found for host%d",
> + d->scsi_host.host);
> + }
>
> out:
> VIR_FREE(sysfs_path);
> --
> 1.7.2
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
ACK
Dave
More information about the libvir-list
mailing list