[stgt] [PATCH 08/13] spc: fix data-in buffer generation for READ_RESERVATION of PERSISTENT_RESERVE_IN

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Mon Feb 11 01:07:23 CET 2013


On Wed, 16 Jan 2013 11:01:48 +0200
nezhinsky at gmail.com wrote:

> From: Alexander Nezhinsky <nezhinsky at gmail.com>
> 
> Generate reservation data-in in a separate buffer and safe-copy it to the
> command buffer taking into account the allocation length. Set the actual
> transfer len correctly.
> 
> Signed-off-by: Alexander Nezhinsky <nezhinsky at gmail.com>
> ---
>  usr/spc.c |   19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/usr/spc.c b/usr/spc.c
> index 4ef57e4..3a86793 100644
> --- a/usr/spc.c
> +++ b/usr/spc.c
> @@ -927,7 +927,8 @@ static int spc_pr_read_reservation(int host_no, struct scsi_cmd *cmd)
>  	uint32_t alloc_len, add_len, avail_len, actual_len;
>  	struct registration *reg;
>  	uint64_t res_key;
> -	uint8_t *buf;
> +	uint8_t buf[32];
> +	uint8_t *data;
>  	uint16_t asc = ASC_INVALID_FIELD_IN_CDB;
>  	uint8_t key = ILLEGAL_REQUEST;
>  
> @@ -942,8 +943,7 @@ static int spc_pr_read_reservation(int host_no, struct scsi_cmd *cmd)
>  	add_len = (reg ? 16 : 0);
>  	avail_len = 8 + add_len;
>  
> -	buf = scsi_get_in_buffer(cmd);
> -	memset(buf, 0, alloc_len);
> +	memset(buf, 0, avail_len);
>  
>  	put_unaligned_be32(cmd->dev->prgeneration, &buf[0]);
>  	put_unaligned_be32(add_len, &buf[4]); /* additional length */
> @@ -955,15 +955,14 @@ static int spc_pr_read_reservation(int host_no, struct scsi_cmd *cmd)
>  		else
>  			res_key = reg->key;
>  
> -		if (alloc_len > 15)
> -			put_unaligned_be64(res_key, &buf[8]);
> -		if (alloc_len > 21) {
> -			buf[21] = (reg->pr_scope << 4) & 0xf0;
> -			buf[21] |= reg->pr_type & 0x0f;
> -		}
> +		put_unaligned_be64(res_key, &buf[8]);
> +
> +		buf[21] = (reg->pr_scope << 4) & 0xf0;
> +		buf[21] |= reg->pr_type & 0x0f;
>  	}
>  
> -	actual_len = min_t(uint32_t, alloc_len, avail_len);
> +	data = scsi_get_in_buffer(cmd);
> +	actual_len = mem_copy_n32(data, buf, avail_len, NULL, &alloc_len);

Confusing again. The third arugment is supposed to be 'src_len'.

>  	scsi_set_in_resid_by_actual(cmd, actual_len);
>  
>  	return SAM_STAT_GOOD;
> -- 
> 1.7.9.6
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list