diff mbox

multipath-tools/path_priority/pp_alua rtpg.c

Message ID 20090408213845.10235.qmail@sourceware.org (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

bmarzins@sourceware.org April 8, 2009, 9:38 p.m. UTC
CVSROOT:	/cvs/dm
Module name:	multipath-tools
Branch: 	RHEL5_FC6
Changes by:	bmarzins@sourceware.org	2009-04-08 21:38:45

Modified files:
	path_priority/pp_alua: rtpg.c 

Log message:
	Fix for bz #490633. Adjust SCSI RTPG request buffer size in ALUA prioritizer.
	Already upstream.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/path_priority/pp_alua/rtpg.c.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.3&r2=1.3.2.1


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Comments

Konrad Rzeszutek April 8, 2009, 10:08 p.m. UTC | #1
On Wed, Apr 08, 2009 at 09:38:45PM -0000, bmarzins@sourceware.org wrote:
> CVSROOT:	/cvs/dm
> Module name:	multipath-tools
> Branch: 	RHEL5_FC6
> Changes by:	bmarzins@sourceware.org	2009-04-08 21:38:45
> 
> Modified files:
> 	path_priority/pp_alua: rtpg.c 
> 
> Log message:
> 	Fix for bz #490633. Adjust SCSI RTPG request buffer size in ALUA prioritizer.
> 	Already upstream.
> 
> Patches:
> http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/path_priority/pp_alua/rtpg.c.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.3&r2=1.3.2.1
> 
> --- multipath-tools/path_priority/pp_alua/rtpg.c	2006/07/13 19:49:23	1.3
> +++ multipath-tools/path_priority/pp_alua/rtpg.c	2009/04/08 21:38:44	1.3.2.1
> @@ -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,38 @@
>  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);
> +	if (!buf) {
> +		PRINT_DEBUG ("malloc failed: could not allocate"
> +			"%u bytes\n", buflen);
> +		return -RTPG_RTPG_FAILED;
> +	}
> +	rc = do_rtpg(fd, buf, buflen);
>  	if (rc < 0)

Shouldn't there be a 'free(buf)' here? ooh, looks like upstream is missing it
too.

>  		return rc;
> +	scsi_buflen = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3];
> +	if (buflen < (scsi_buflen + 4)) {

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
diff mbox

Patch

--- multipath-tools/path_priority/pp_alua/rtpg.c	2006/07/13 19:49:23	1.3
+++ multipath-tools/path_priority/pp_alua/rtpg.c	2009/04/08 21:38:44	1.3.2.1
@@ -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,38 @@ 
 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);
+	if (!buf) {
+		PRINT_DEBUG ("malloc failed: could not allocate"
+			"%u bytes\n", buflen);
+		return -RTPG_RTPG_FAILED;
+	}
+	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) {
+			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)
+			goto out;
+	}
+
 
 	tpgd = (struct rtpg_data *) buf;
 	rc   = -RTPG_TPG_NOT_FOUND;
@@ -274,7 +299,8 @@ 
 			}
 		}
 	}
-
+out:
+	free(buf);
 	return rc;
 }