[PATCH 2/2] multipath-tools: Generalizing the vpd 0x83 processing with correct buffer length

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

 



Right now the buffer length for inquiry vpd 0x83 is hardcoded to 128 bytes.
This can cause problems if the length of all the designation descriptors 
exceed 128 bytes. This was causing me issues while configuring my storage
with alua. I have generalized the processing with correct buffer length.
Patch has been tested with NetApp E-series storage.

Signed-off-by: Babu Moger <babu.moger@xxxxxxxxxx>
---
--- multipath-tools/libmultipath/prioritizers/alua_rtpg.c.orig	2012-02-21 17:16:06.000000000 -0600
+++ multipath-tools/libmultipath/prioritizers/alua_rtpg.c	2012-02-21 17:20:06.000000000 -0600
@@ -172,38 +172,62 @@ get_target_port_group_support(int fd)
 int
 get_target_port_group(int fd)
 {
-	unsigned char		buf[128];
+	unsigned char		*buf;
 	struct vpd83_data *	vpd83;
 	struct vpd83_dscr *	dscr;
 	int			rc;
+	int			buflen, scsi_buflen;
 
-	memset(buf, 0, sizeof(buf));
-	rc = do_inquiry(fd, 1, 0x83, buf, sizeof(buf));
-	if (!rc) {
-		vpd83 = (struct vpd83_data *) buf;
-
-		rc = -RTPG_NO_TPG_IDENTIFIER;
-		FOR_EACH_VPD83_DSCR(vpd83, dscr) {
-			if (vpd83_dscr_istype(dscr, IDTYPE_TARGET_PORT_GROUP)) {
-				struct vpd83_tpg_dscr *	p;
-
-				if (rc != -RTPG_NO_TPG_IDENTIFIER) {
-					PRINT_DEBUG("get_target_port_group: "
-						"more than one TPG identifier "
-						"found!\n");
-					continue;
-				}
+	buflen = 128; /* Lets start from 128 */
+	buf = (unsigned char *)malloc(buflen);
+	if (!buf) {
+		PRINT_DEBUG("malloc failed: could not allocate"
+			     "%u bytes\n", buflen);
+		return -RTPG_RTPG_FAILED;
+	}
 
-				p  = (struct vpd83_tpg_dscr *) dscr->data;
-				rc = get_uint16(p->tpg);
-			}
+	memset(buf, 0, buflen);
+	rc = do_inquiry(fd, 1, 0x83, buf, buflen);
+	if (rc < 0)
+		goto out;
+
+	scsi_buflen = (buf[2] << 8 | buf[3]) + 4;
+	if (buflen < scsi_buflen) {
+		free(buf);
+		buf = (unsigned char *)malloc(scsi_buflen);
+		if (!buf) {
+			PRINT_DEBUG("malloc failed: could not allocate"
+				     "%u bytes\n", scsi_buflen);
+			return -RTPG_RTPG_FAILED;
 		}
-		if (rc == -RTPG_NO_TPG_IDENTIFIER) {
-			PRINT_DEBUG("get_target_port_group: "
-				"no TPG identifier found!\n");
+		buflen = scsi_buflen;
+		memset(buf, 0, buflen);
+		rc = do_inquiry(fd, 1, 0x83, buf, buflen);
+		if (rc < 0)
+			goto out;
+	}
+
+	vpd83 = (struct vpd83_data *) buf;
+	rc = -RTPG_NO_TPG_IDENTIFIER;
+	FOR_EACH_VPD83_DSCR(vpd83, dscr) {
+		if (vpd83_dscr_istype(dscr, IDTYPE_TARGET_PORT_GROUP)) {
+			struct vpd83_tpg_dscr *p;
+			if (rc != -RTPG_NO_TPG_IDENTIFIER) {
+				PRINT_DEBUG("get_target_port_group: more "
+					    "than one TPG identifier found!\n");
+				continue;
+			}
+			p  = (struct vpd83_tpg_dscr *)dscr->data;
+			rc = get_uint16(p->tpg);
 		}
 	}
 
+	if (rc == -RTPG_NO_TPG_IDENTIFIER) {
+		PRINT_DEBUG("get_target_port_group: "
+			    "no TPG identifier found!\n");
+	}
+out:
+	free(buf);
 	return rc;
 }
 



--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux