Add failback code to get the uid for dasd devices from sysfs. Copied
from dasdinfo

Reviewed-by: Martin Wilck <[email protected]>
Signed-off-by: Benjamin Marzinski <[email protected]>
---
 libmultipath/defaults.h  |  1 +
 libmultipath/discovery.c | 37 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
index 39a5e415..947ba467 100644
--- a/libmultipath/defaults.h
+++ b/libmultipath/defaults.h
@@ -8,6 +8,7 @@
  */
 #define DEFAULT_UID_ATTRIBUTE  "ID_SERIAL"
 #define DEFAULT_NVME_UID_ATTRIBUTE     "ID_WWN"
+#define DEFAULT_DASD_UID_ATTRIBUTE     "ID_UID"
 #define DEFAULT_UDEVDIR                "/dev"
 #define DEFAULT_MULTIPATHDIR   "/" LIB_STRING "/multipath"
 #define DEFAULT_SELECTOR       "service-time 0"
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 000f4c96..f650534f 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -1953,12 +1953,44 @@ get_vpd_uid(struct path * pp)
        return get_vpd_sysfs(parent, 0x83, pp->wwid, WWID_SIZE);
 }
 
+/* based on code from s390-tools/dasdinfo/dasdinfo.c */
+static ssize_t dasd_get_uid(struct path *pp)
+{
+       struct udev_device *parent;
+       char value[80];
+       char *p;
+       int i;
+
+       parent = udev_device_get_parent_with_subsystem_devtype(pp->udev, "ccw",
+                                                              NULL);
+       if (!parent)
+               return -1;
+
+       if (sysfs_attr_get_value(parent, "uid", value, 80) < 0)
+               return -1;
+
+       p = value - 1;
+       /* look for the 4th '.' and cut there */
+       for (i = 0; i < 4; i++) {
+               p = index(p + 1, '.');
+               if (!p)
+                       break;
+       }
+       if (p)
+               *p = '\0';
+
+       return strlcpy(pp->wwid, value, WWID_SIZE);
+}
+
 static ssize_t uid_fallback(struct path *pp, int path_state,
                            const char **origin)
 {
        ssize_t len = -1;
 
-       if (pp->bus == SYSFS_BUS_SCSI) {
+       if (pp->bus == SYSFS_BUS_CCW) {
+               len = dasd_get_uid(pp);
+               *origin = "sysfs";
+       } else if (pp->bus == SYSFS_BUS_SCSI) {
                len = get_vpd_uid(pp);
                *origin = "sysfs";
                if (len < 0 && path_state == PATH_UP) {
@@ -2006,6 +2038,9 @@ static bool has_uid_fallback(struct path *pp)
                  !strcmp(pp->uid_attribute, ""))) ||
                (pp->bus == SYSFS_BUS_NVME &&
                 (!strcmp(pp->uid_attribute, DEFAULT_NVME_UID_ATTRIBUTE) ||
+                 !strcmp(pp->uid_attribute, ""))) ||
+               (pp->bus == SYSFS_BUS_CCW &&
+                (!strcmp(pp->uid_attribute, DEFAULT_DASD_UID_ATTRIBUTE) ||
                  !strcmp(pp->uid_attribute, ""))));
 }
 
-- 
2.17.2

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to