[PATCH] path_id: add handle_scsi_sas

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux