[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[dm-devel] [PATCH] 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
-- 
Dr. Hannes Reinecke			hare suse de
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(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -181,6 +181,8 @@ sysfs_get_##fname (char * sysfs_path, ch
 	return 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;
 }
 
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
--- a/libmultipath/hwtable.c
+++ b/libmultipath/hwtable.c
@@ -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);
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -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 {

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]