This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/device-mapper-multipath.git#26a2cd7a3e189bf91263d17bc8a8c449cc043fb0
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | |
| From: Benjamin Marzinski <bmarzins@redhat.com>
 | |
| 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 <mwilck@suse.com>
 | |
| Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
 | |
| ---
 | |
|  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, ""))));
 | |
|  }
 | |
|  
 | |
| -- 
 | |
| 2.17.2
 | |
| 
 |