From mboxrd@z Thu Jan 1 00:00:00 1970 From: Benjamin Marzinski Subject: [RFC PATCH v2 2/3] libmultipath: add uid failback for dasd devices Date: Wed, 23 Sep 2020 23:59:28 -0500 Message-ID: <1600923569-17412-3-git-send-email-bmarzins@redhat.com> References: <1600923569-17412-1-git-send-email-bmarzins@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1600923569-17412-1-git-send-email-bmarzins@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com To: Christophe Varoqui Cc: device-mapper development , Martin Wilck List-Id: dm-devel.ids 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 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