[dm-devel] [PATCH 09/12] discovery: Fixup cciss discovery

Hannes Reinecke hare at suse.de
Thu Apr 19 09:09:03 UTC 2012


We can get the sysfs attributes directly from the parent.

Signed-off-by: Hannes Reinecke <hare at suse.de>
---
 libmultipath/discovery.c |   78 +++++++++++++++++++++++++++------------------
 1 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index f45602a..fa8cfa0 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -162,7 +162,7 @@ sysfs_get_timeout(struct path *pp, unsigned int *timeout)
 	int r;
 	unsigned int t;
 
-	if (!pp->udev)
+	if (!pp->udev || pp->bus != SYSFS_BUS_SCSI)
 		return 1;
 
 	parent = pp->udev;
@@ -691,26 +691,56 @@ ccw_sysfs_pathinfo (struct path * pp)
 static int
 cciss_sysfs_pathinfo (struct path * pp)
 {
-	const char * attr_path;
+	const char * attr_path = NULL;
+	struct udev_device *parent;
+
+	parent = pp->udev;
+	while (parent) {
+		if (!strncmp(udev_device_get_subsystem(parent), "cciss", 5)) {
+			attr_path = udev_device_get_sysname(parent);
+			if (!attr_path)
+				break;
+			if (sscanf(attr_path, "c%id%i",
+				   &pp->sg_id.host_no,
+				   &pp->sg_id.scsi_id) == 2)
+				break;
+		}
+		parent = udev_device_get_parent(parent);
+	}
+	if (!attr_path || pp->sg_id.host_no == -1)
+		return 1;
+
+	if (sysfs_get_vendor(parent, pp->vendor_id, SCSI_VENDOR_SIZE))
+		return 1;
+
+	condlog(3, "%s: vendor = %s", pp->dev, pp->vendor_id);
+
+	if (sysfs_get_model(parent, pp->product_id, SCSI_PRODUCT_SIZE))
+		return 1;
+
+	condlog(3, "%s: product = %s", pp->dev, pp->product_id);
+
+	if (sysfs_get_rev(parent, pp->rev, SCSI_REV_SIZE))
+		return 1;
+
+	condlog(3, "%s: rev = %s", pp->dev, pp->rev);
 
 	/*
-	 * host / bus / target / lun
+	 * set the hwe configlet pointer
 	 */
-	attr_path = udev_device_get_devpath(pp->udev);
-	if (!attr_path)
-		return 1;
+	pp->hwe = find_hwe(conf->hwtable, pp->vendor_id, pp->product_id, pp->rev);
 
+	/*
+	 * host / bus / target / lun
+	 */
 	pp->sg_id.lun = 0;
 	pp->sg_id.channel = 0;
-	sscanf(attr_path, "cciss!c%id%i",
-			&pp->sg_id.host_no,
-			&pp->sg_id.scsi_id);
 	condlog(3, "%s: h:b:t:l = %i:%i:%i:%i",
-			pp->dev,
-			pp->sg_id.host_no,
-			pp->sg_id.channel,
-			pp->sg_id.scsi_id,
-			pp->sg_id.lun);
+		pp->dev,
+		pp->sg_id.host_no,
+		pp->sg_id.channel,
+		pp->sg_id.scsi_id,
+		pp->sg_id.lun);
 	return 0;
 }
 
@@ -818,23 +848,9 @@ scsi_ioctl_pathinfo (struct path * pp, int mask)
 static int
 cciss_ioctl_pathinfo (struct path * pp, int mask)
 {
-	int ret;
-
-	if (mask & DI_SYSFS) {
-		ret = get_inq(pp->dev, pp->vendor_id, pp->product_id,
-			      pp->rev, pp->fd);
-		if (ret)
-			return ret;
-
-		condlog(3, "%s: vendor = %s", pp->dev, pp->vendor_id);
-		condlog(3, "%s: product = %s", pp->dev, pp->product_id);
-		condlog(3, "%s: revision = %s", pp->dev, pp->rev);
-		/*
-		 * set the hwe configlet pointer
-		 */
-		pp->hwe = find_hwe(conf->hwtable, pp->vendor_id,
-				   pp->product_id, pp->rev);
-
+	if (mask & DI_SERIAL) {
+		get_serial(pp->serial, SERIAL_SIZE, pp->fd);
+		condlog(3, "%s: serial = %s", pp->dev, pp->serial);
 	}
 	return 0;
 }
-- 
1.7.3.4




More information about the dm-devel mailing list