[libvirt] [PATCH 17/25] utils: Add a helper to get the device name that sg device mapped to

John Ferlan jferlan at redhat.com
Tue May 7 14:00:31 UTC 2013


On 05/03/2013 02:07 PM, Osier Yang wrote:
> E.g.
> 
> % sg_map
> /dev/sg0  /dev/sda
> /dev/sg1  /dev/sr0
> 
> What the helper gets for /dev/sg0 is /dev/sda, it will be used by
> later patch.
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virscsi.c       | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/virscsi.h       |  4 ++++
>  3 files changed, 52 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index fa59c14..8a7105c 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1692,6 +1692,7 @@ virSCSIDeviceFileIterate;
>  virSCSIDeviceFree;
>  virSCSIDeviceGetAdapter;
>  virSCSIDeviceGetBus;
> +virSCSIDeviceGetDevName;
>  virSCSIDeviceGetName;
>  virSCSIDeviceGetReadonly;
>  virSCSIDeviceGetSgName;
> diff --git a/src/util/virscsi.c b/src/util/virscsi.c
> index 7d3d40e..f337c75 100644
> --- a/src/util/virscsi.c
> +++ b/src/util/virscsi.c
> @@ -143,6 +143,53 @@ cleanup:
>      return sg;
>  }
>  
> +/* Returns device name (e.g. "sdc") on success, or NULL
> + * on failure.
> + */
> +char *
> +virSCSIDeviceGetDevName(const char *adapter,
> +                        unsigned int bus,
> +                        unsigned int target,
> +                        unsigned int unit)
> +{
> +    DIR *dir = NULL;
> +    struct dirent *entry;
> +    char *path = NULL;
> +    char *name = NULL;
> +    unsigned int adapter_id;
> +
> +    if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
> +        return NULL;
> +
> +    if (virAsprintf(&path,
> +                    SYSFS_SCSI_DEVICES "/%d:%d:%d:%d/block",
> +                    adapter_id, bus, target, unit) < 0) {
> +        virReportOOMError();
> +        return NULL;
> +    }
> +
> +    if (!(dir = opendir(path))) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Failed to open %s"), path);
> +        goto cleanup;
> +    }
> +
> +    while ((entry = readdir(dir))) {
> +        if (entry->d_name[0] == '.')
> +            continue;
> +
> +        if (!(name = strdup(entry->d_name))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }

If 'name' then what - we go back to the top of the loop and if there's
more entries then we'll strdup() another name....  Although I have to
wonder if there can be more than non hidden entry in the list...  Makes
me wonder about my earlier reviews which didn't think about the loop
exit (that is virSCSIDeviceGetSgName())

ACK with the proper exit strategy.

John
> +    }
> +
> +cleanup:
> +    closedir(dir);
> +    VIR_FREE(path);
> +    return name;
> +}
> +
>  virSCSIDevicePtr
>  virSCSIDeviceNew(const char *adapter,
>                   unsigned int bus,
> diff --git a/src/util/virscsi.h b/src/util/virscsi.h
> index 8268cdf..cce5df4 100644
> --- a/src/util/virscsi.h
> +++ b/src/util/virscsi.h
> @@ -37,6 +37,10 @@ char *virSCSIDeviceGetSgName(const char *adapter,
>                               unsigned int bus,
>                               unsigned int target,
>                               unsigned int unit);
> +char *virSCSIDeviceGetDevName(const char *adapter,
> +                              unsigned int bus,
> +                              unsigned int target,
> +                              unsigned int unit);
>  
>  virSCSIDevicePtr virSCSIDeviceNew(const char *adapter,
>                                    unsigned int bus,
> 




More information about the libvir-list mailing list