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

Christophe Varoqui christophe.varoqui at gmail.com
Wed Feb 22 21:46:28 UTC 2012


On mer., 2012-02-22 at 18:09 +0000, Moger, Babu wrote:
> 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.
> 
Both patches applied.
Thanks.

> Signed-off-by: Babu Moger <babu.moger at netapp.com>
> ---
> --- 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;
>  }
>  
> 
> 
> 
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel






More information about the dm-devel mailing list