linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] path_id: add handle_scsi_sas
@ 2010-06-25 12:28 harald
  2010-06-25 13:27 ` harald
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: harald @ 2010-06-25 12:28 UTC (permalink / raw)
  To: linux-hotplug

From: Harald Hoyer <harald@redhat.com>

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..8dbdd30 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 : "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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-07-07 12:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-25 12:28 [PATCH] path_id: add handle_scsi_sas harald
2010-06-25 13:27 ` harald
2010-06-25 13:29 ` Harald Hoyer
2010-07-07 10:20 ` Hannes Reinecke
2010-07-07 12:05 ` Kay Sievers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).