[PATCH 07/13] libmultipath: move sysfs checks out of scsi_ioctl_pathinfo

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

 



There are multiple checks in scsi_ioctl_pathinfo() that only use sysfs.
pathinfo() is never called with DI_SERIAL and not DI_SYSFS, so it's safe
to move them to scsi_sysfs_pathinfo(). The HCTL checking code is already
there, so remove the duplicate, and split the sysfs serial checking from
the ioctl serial checking.

Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
---
 libmultipath/discovery.c | 36 ++++++++----------------------------
 tests/test-lib.c         |  6 ------
 2 files changed, 8 insertions(+), 34 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 3d4da127..ea10f086 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -1581,6 +1581,9 @@ scsi_sysfs_pathinfo (struct path *pp, const struct vector_s *hwtable)
 	condlog(3, "%s: tgt_node_name = %s",
 		pp->dev, pp->tgt_node_name);
 
+	if (get_vpd_sysfs(parent, 0x80, pp->serial, SERIAL_SIZE) > 0)
+		condlog(3, "%s: serial = %s (sysfs)", pp->dev, pp->serial);
+
 	return PATHINFO_OK;
 }
 
@@ -1907,8 +1910,6 @@ sysfs_pathinfo(struct path *pp, const struct vector_s *hwtable)
 static void
 scsi_ioctl_pathinfo (struct path * pp, int mask)
 {
-	struct udev_device *parent;
-	const char *attr_path = NULL;
 	int vpd_id;
 
 	if (!(mask & DI_SERIAL))
@@ -1933,34 +1934,13 @@ scsi_ioctl_pathinfo (struct path * pp, int mask)
 		}
 	}
 
-	parent = pp->udev;
-	while (parent) {
-		const char *subsys = udev_device_get_subsystem(parent);
-		if (subsys && !strncmp(subsys, "scsi", 4)) {
-			attr_path = udev_device_get_sysname(parent);
-			if (!attr_path)
-				break;
-			if (sscanf(attr_path, "%i:%i:%i:%" SCNu64,
-				   &pp->sg_id.host_no,
-				   &pp->sg_id.channel,
-				   &pp->sg_id.scsi_id,
-				   &pp->sg_id.lun) == 4)
-				break;
-		}
-		parent = udev_device_get_parent(parent);
-	}
-	if (!attr_path || pp->sg_id.host_no == -1)
-		return;
-
-	if (get_vpd_sysfs(parent, 0x80, pp->serial, SERIAL_SIZE) <= 0) {
-		if (get_serial(pp->serial, SERIAL_SIZE, pp->fd)) {
+	if (pp->serial[0] == '\0') {
+		if (get_serial(pp->serial, SERIAL_SIZE, pp->fd))
 			condlog(3, "%s: fail to get serial", pp->dev);
-			return;
-		}
+		else
+			condlog(3, "%s: serial = %s (ioctl)", pp->dev,
+				pp->serial);
 	}
-
-	condlog(3, "%s: serial = %s", pp->dev, pp->serial);
-	return;
 }
 
 static void
diff --git a/tests/test-lib.c b/tests/test-lib.c
index bb1d8cdd..cb60f10e 100644
--- a/tests/test-lib.c
+++ b/tests/test-lib.c
@@ -339,12 +339,6 @@ void mock_pathinfo(int mask, const struct mocked_path *mp)
 	if (mp->flags & NEED_FD)
 		will_return(__wrap_udev_device_get_devnode, _mocked_filename);
 
-	/* scsi_ioctl_pathinfo() */
-	if (mask & DI_SERIAL) {
-		will_return(__wrap_udev_device_get_subsystem, "scsi");
-		will_return(__wrap_udev_device_get_sysname, hbtl);
-	}
-
 	if (mask & DI_WWID) {
 		/* get_udev_uid() */
 		will_return(__wrap_udev_device_get_property_value,
-- 
2.46.2





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux