[PATCH] path_id: Re-introduce SAS phy enumeration of devices

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

 



When path_id was converted to C code the enumeration of SAS
devices by phy disappeared. This patch reintroduces enumeration
of the form

pci-0000:05:00.0-sas-phy0:1-0x500000e114de2b42:0-lun0

where phy0:1 is the reintroduced substring where 0 corresponds
to the lowest phy identifier on the port to which the device
is connected and 1 is the number of phys on the port.

Please test this patch thoroughly as it has only been tested
with an older version of udev.

Signed-off-by: Nils Carlson <nils.carlson@xxxxxxxxxxxx>
---
 src/udev-builtin-path_id.c |   80 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 79 insertions(+), 1 deletion(-)

diff --git a/src/udev-builtin-path_id.c b/src/udev-builtin-path_id.c
index a8559d2..c575fd4 100644
--- a/src/udev-builtin-path_id.c
+++ b/src/udev-builtin-path_id.c
@@ -121,13 +121,67 @@ out:
         return parent;
 }
 
+static int get_sas_port_phy_id(struct udev *udev, const char *phy_name)
+{
+        struct udev_device *phydev;
+        const char *phy_id_str;
+        int phy_id = -1;
+
+        phydev = udev_device_new_from_subsystem_sysname(udev, "sas_phy",
+                                                        phy_name);
+        if (phydev == NULL) {
+                return -1;
+        }
+
+        phy_id_str = udev_device_get_sysattr_value(phydev, "phy_identifier");
+        if (phy_id_str == NULL) {
+                goto out;
+        }
+
+        phy_id = atoi(phy_id_str);
+
+out:
+        udev_device_unref(phydev);
+
+        return phy_id;
+}
+
+static int get_sas_port_num_phys(struct udev *udev, const char *port_name)
+{
+        struct udev_device *portdev;
+        const char *num_phys_str;
+        int num_phys = -1;
+
+        portdev = udev_device_new_from_subsystem_sysname(udev, "sas_port",
+                                                         port_name);
+        if (portdev == NULL) {
+                return -1;
+        }
+
+        num_phys_str = udev_device_get_sysattr_value(portdev, "num_phys");
+        if (num_phys_str == NULL) {
+                goto out;
+        }
+
+        num_phys = atoi(num_phys_str);
+
+out:
+        udev_device_unref(portdev);
+
+        return num_phys;
+}
+
 static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path)
 {
         struct udev *udev  = udev_device_get_udev(parent);
         struct udev_device *targetdev;
         struct udev_device *target_parent;
         struct udev_device *sasdev;
+	struct udev_device *portdev;
+	struct udev_list_entry *list_entry;
         const char *sas_address;
+	int tmp_phy_id, phy_id = 255;
+	int num_phys;
         char *lun = NULL;
 
         targetdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_target");
@@ -138,6 +192,29 @@ static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **pa
         if (target_parent == NULL)
                 return NULL;
 
+	portdev = udev_device_get_parent(target_parent);
+	if (target_parent == NULL)
+		return NULL;
+
+	udev_list_entry_foreach(list_entry,
+				udev_device_get_sysattr_list_entry(portdev)) {
+		const char *name = udev_list_entry_get_name(list_entry);
+
+		if (strncmp(name, "phy", 3) != 0)
+			continue;
+
+		tmp_phy_id = get_sas_port_phy_id(udev, name);
+		if (tmp_phy_id >= 0 && tmp_phy_id < phy_id)
+			phy_id = tmp_phy_id;
+	}
+	if (phy_id == 255)
+		return NULL;
+
+	num_phys = get_sas_port_num_phys(udev,
+					 udev_device_get_sysname(portdev));
+	if (num_phys < 0)
+		return NULL;
+
         sasdev = udev_device_new_from_subsystem_sysname(udev, "sas_device",
                                 udev_device_get_sysname(target_parent));
         if (sasdev == NULL)
@@ -150,7 +227,8 @@ static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **pa
         }
 
         format_lun_number(parent, &lun);
-        path_prepend(path, "sas-%s-%s", sas_address, lun);
+	path_prepend(path, "sas-phy%d:%d-%s-%s", phy_id, num_phys,
+		     sas_address, lun);
         if (lun)
                 free(lun);
 out:
-- 
1.7.9.4

--
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