S/390 DASD support for multipath-tools
PATCH 1/1 S/390 DASD support for multipath-tools
Hi Christophe,
this patch adds S/390 DASD support for multipath-tools.
As the DASD do have their own type of multipathing (called PAV there) I don't see why multipath-tools shouldn't support it.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke [email protected] SuSE Linux Products GmbH S390 & zSeries Maxfeldstraße 5 +49 911 74053 688 90409 Nürnberg http://www.suse.de
Add support for S/390 DASD
On newer zSeries hardware the default disks (called DASDs) have a multipath feature built-in (aka PAV for Parallel Access Volumes). This patch enables support for these disks.
Signed-off-by Hannes Reinecke
---
libmultipath/discovery.c | 64 +++++++++++++++++++++++++++++++++++++++++++++- libmultipath/hwtable.c | 4 +++ libmultipath/structs.h | 3 +- 3 files changed, 68 insertions(+), 3 deletions(-)
libmultipath/discovery.c +62 -2
@@ -181,6 +181,8 @@ sysfs_get_##fname (char * sysfs_path, chreturn 0 ; \ } +declare_sysfs_get_str (devtype,"%s/block/%s/device/devtype" ); +declare_sysfs_get_str (cutype,"%s/block/%s/device/cutype" );declare_sysfs_get_str (vendor,"%s/block/%s/device/vendor" );declare_sysfs_get_str (model,"%s/block/%s/device/model" );declare_sysfs_get_str (rev,"%s/block/%s/device/rev" );
@@ -392,6 +394,8 @@ sysfs_get_bus (char * sysfs_path, struct curpath->bus =SYSFS_BUS_SCSI ; else if (!strncmp(sdev->bus, "ide", 3)) curpath->bus =SYSFS_BUS_IDE ; + else if (!strncmp(sdev->bus, "ccw", 3)) + curpath->bus =SYSFS_BUS_CCW ; else return 1;
@@ -469,6 +473,59 @@ scsi_sysfs_pathinfo (struct path * curpa }static int +ccw_sysfs_pathinfo (struct path * curpath) +{ +char attr_path[FILE_NAME_SIZE ]; +char attr_buff[FILE_NAME_SIZE ]; + +sprintf (curpath->vendor_id,"IBM" ); + +condlog (3 ,"vendor = %s" , curpath->vendor_id); + +if (sysfs_get_devtype (sysfs_path, curpath->dev, + attr_buff,FILE_NAME_SIZE )) +return 1 ; + +if (!strncmp (attr_buff,"3370" ,4 )) { +sprintf (curpath->product_id,"S/390 DASD FBA" ); + }else if (!strncmp (attr_buff,"9336" ,4 )) { +sprintf (curpath->product_id,"S/390 DASD FBA" ); + }else { +sprintf (curpath->product_id,"S/390 DASD ECKD" ); + } + +condlog (3 ,"product = %s" , curpath->product_id); + +/* +* host / bus / target / lun +*/ +if (safe_sprintf (attr_path,"%s/block/%s/device" , + sysfs_path, curpath->dev)) { +condlog (0 ,"attr_path too small" ); +return 1 ; + } +if (0 >sysfs_get_link (attr_path, attr_buff,sizeof (attr_buff))) +return 1 ; + +basename (attr_buff, attr_path); + +condlog (3 ,"device path %s" , attr_path); + + curpath->sg_id.lun =0 ; +sscanf (attr_path,"%i.%i.%x" , + &curpath->sg_id.host_no, + &curpath->sg_id.channel, + &curpath->sg_id.scsi_id); +condlog (3 ,"h:b:t:l = %i:%i:%i:%i" , + curpath->sg_id.host_no, + curpath->sg_id.channel, + curpath->sg_id.scsi_id, + curpath->sg_id.lun); + +return 0 ; +} + +static int common_sysfs_pathinfo (struct path * curpath) {if (sysfs_get_bus (sysfs_path, curpath))
@@ -498,10 +555,13 @@ sysfs_pathinfo(struct path * curpath)if (curpath->bus ==SYSFS_BUS_UNDEF )return 0 ; -else if (curpath->bus ==SYSFS_BUS_SCSI ) +else if (curpath->bus ==SYSFS_BUS_SCSI ) {if (scsi_sysfs_pathinfo (curpath))return 1 ; - + }else if (curpath->bus ==SYSFS_BUS_CCW ) { +if (ccw_sysfs_pathinfo (curpath)) +return 1 ; + }return 0 ; }
libmultipath/hwtable.c +4 -0
@@ -53,6 +53,10 @@ setup_default_hwtable (vector hw)/* IBM SAN Volume Controller */ r +=store_hwe_ext (hw,"IBM" ,"2145" ,MULTIBUS ,DEFAULT_GETUID ,NULL ,"0" ,"1 queue_if_no_path" ,"tur" ,FAILBACK_UNDEF ); +/* IBM S/390 ECKD DASD */ + r +=store_hwe_ext (hw,"IBM" ,"S/390 DASD ECKD" ,MULTIBUS , +"/sbin/dasdview -j /dev/%n" ,NULL ,"0" ,"0" , +"directio" ,FAILBACK_UNDEF ); r +=store_hwe_ext (hw,"NETAPP" ,"LUN" ,GROUP_BY_PRIO ,DEFAULT_GETUID ,"/sbin/mpath_prio_netapp /dev/%n" ,NULL ,"1 queue_if_no_path" ,"readsector0" ,FAILBACK_UNDEF );
libmultipath/structs.h +2 -1
@@ -38,7 +38,8 @@ enum failback_mode {enum sysfs_buses {SYSFS_BUS_UNDEF ,SYSFS_BUS_SCSI , -SYSFS_BUS_IDE +SYSFS_BUS_IDE , +SYSFS_BUS_CCW };enum pathstates {