From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 21 Oct 2020 16:39:25 -0500 Subject: [PATCH] libmultipath: add uid failback for dasd devices Add failback code to get the uid for dasd devices from sysfs. Copied from dasdinfo Reviewed-by: Martin Wilck Signed-off-by: Benjamin Marzinski --- 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 e7084664..877e8f2b 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1959,12 +1959,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) { @@ -2012,6 +2044,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, "")))); }