From: Harald Hoyer <harald@xxxxxxxxxx> based on code by Jim Garlick. --- extras/path_id/path_id.c | 64 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 63 insertions(+), 1 deletions(-) diff --git a/extras/path_id/path_id.c b/extras/path_id/path_id.c index dcee378..c3d241b 100644 --- a/extras/path_id/path_id.c +++ b/extras/path_id/path_id.c @@ -121,7 +121,69 @@ out: static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path) { - return NULL; + struct udev *udev = udev_device_get_udev(parent); + struct udev_device *end_dev; + struct udev_device *sasdev; + struct udev_device *phydev; + struct udev_device *parent_dev; + struct udev_device *child_dev; + char syspath[UTIL_PATH_SIZE], *base; + char phy_path[UTIL_PATH_SIZE]; + const char *end_name, *name, *enc, *bay; + const char *port_path; + int scsi_host; + int num_phys = 8; + int i; + + parent_dev = parent; + while (1) { + child_dev = parent_dev; + parent_dev = udev_device_get_parent(child_dev); + if (parent_dev == NULL) + return NULL; + name = udev_device_get_sysname(parent_dev); + if (strstr(name, "end_device-")) { + end_dev = parent_dev; + end_name = name; + } else if (sscanf(name, "host%d", &scsi_host)) { + port_path = udev_device_get_syspath(child_dev); + break; + } + } + + base = strdup(udev_device_get_syspath(end_dev)); + if (!base) + return NULL; + snprintf(syspath, sizeof(syspath), "%s/sas_device/%s", base, end_name); + free(base); + + for (i = 0 ; i < num_phys ; i++) { + snprintf(phy_path, sizeof(phy_path), "%s/phy-%d:%d", + port_path, scsi_host, i); + if (phydev = udev_device_new_from_syspath(udev, phy_path)) { + udev_device_unref(phydev); + break; + } + } + if (i == num_phys) + return NULL; + + sasdev = udev_device_new_from_syspath(udev, syspath); + if (sasdev == NULL) { + fprintf(stderr, "unable to access '%s'\n", syspath); + return NULL; + } + enc = udev_device_get_sysattr_value(sasdev, "enclosure_identifier"); + bay = udev_device_get_sysattr_value(sasdev, "bay_identifier"); + if (bay == NULL) { + parent = NULL; + goto out; + } + + path_prepend(path, "sas-%s-%s-%s", strrchr(phy_path, '/') + 1, enc ? enc : "unknown", bay); +out: + udev_device_unref(sasdev); + return parent; } static struct udev_device *handle_scsi_iscsi(struct udev_device *parent, char **path) -- 1.7.0.1 -- To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html