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; + } + } + +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, -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list