[dm-devel] [PATCH 1/1] Resend RTPG command if buffer short

Brian Geisel brian.geisel at incipient.com
Wed Nov 15 00:04:54 UTC 2006


Hi Christophe,

The following patch adds error and size checking to the REPORT TARGET
PORT GROUPS command issued by rtpg.c.  The old code issued a buffer of
128 bytes, but never checked the return length.  The new code starts
with a buffer of 128 bytes, but reallocates it if the buffer is too
small (SCSI returns the necessary length in the response data).  This is
more robust as it handles devices that consume more than 128 bytes for
RTPG, like the Incipient NSP.

I tried to handle errors, etc. as closely as I could to what is already
there in the code.  Let me know if you'd prefer anything written
differently.

Thanks,
Brian Geisel


--- a/path_priority/pp_alua/rtpg.c
+++ b/path_priority/pp_alua/rtpg.c
@@ -21,6 +21,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <errno.h>
+#include <inttypes.h>
 
 #define __user
 #include <scsi/sg.h>
@@ -251,14 +252,33 @@
 int
 get_asymmetric_access_state(int fd, unsigned int tpg)
 {
-	unsigned char		buf[128];
+	unsigned char		*buf;
 	struct rtpg_data *	tpgd;
 	struct rtpg_tpg_dscr *	dscr;
 	int			rc;
+	int			buflen;
+	uint32_t		scsi_buflen;
 
-	rc = do_rtpg(fd, buf, sizeof(buf));
+	buflen = 128; /* Initial value from old code */
+	buf = (unsigned char *)malloc(buflen);
+	rc = do_rtpg(fd, buf, buflen);
 	if (rc < 0)
 		return rc;
+	scsi_buflen = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 |
buf[3];
+	if (buflen < (scsi_buflen + 4)) {
+		free(buf);
+		buf = (unsigned char *)malloc(scsi_buflen);
+		if (buf == NULL) {
+			PRINT_DEBUG ("malloc failed: could not allocate"
+				"%u bytes\n", scsi_buflen);
+			return -RTPG_RTPG_FAILED;
+		}
+		buflen = scsi_buflen;
+		rc = do_rtpg(fd, buf, buflen);
+		if (rc < 0)
+			return rc;
+	}
+		
 
 	tpgd = (struct rtpg_data *) buf;
 	rc   = -RTPG_TPG_NOT_FOUND;
@@ -275,6 +295,7 @@
 		}
 	}
 
+	free(buf);
 	return rc;
 }





More information about the dm-devel mailing list