diff mbox

scsi: Fixup fixed sense generation

Message ID 1438347903-106697-1-git-send-email-hare@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Hannes Reinecke July 31, 2015, 1:05 p.m. UTC
Fixed sense reserves only 32 bits for the 'information' field,
so we need to restrict the 'information' value to avoid sense
data corruption.
Also the sense key is only 4 bits.

Signed-off-by: Hannes Reinecke <hare@suse.com>
---
 drivers/scsi/scsi_error.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Bart Van Assche July 31, 2015, 2:05 p.m. UTC | #1
On 07/31/15 06:05, Hannes Reinecke wrote:
> Fixed sense reserves only 32 bits for the 'information' field,
> so we need to restrict the 'information' value to avoid sense
> data corruption.
> Also the sense key is only 4 bits.
>
> Signed-off-by: Hannes Reinecke <hare@suse.com>
> ---
>   drivers/scsi/scsi_error.c | 10 +++++++---
>   1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index 106884a..ba7ffc4 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -2510,13 +2510,13 @@ void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
>   {
>   	if (desc) {
>   		buf[0] = 0x72;	/* descriptor, current */
> -		buf[1] = key;
> +		buf[1] = key & 0x0f;
>   		buf[2] = asc;
>   		buf[3] = ascq;
>   		buf[7] = 0;
>   	} else {
>   		buf[0] = 0x70;	/* fixed, current */
> -		buf[2] = key;
> +		buf[2] = key & 0x0f;
>   		buf[7] = 0xa;
>   		buf[12] = asc;
>   		buf[13] = ascq;

Please split these changes into two separate patches - one patch for the 
scsi_build_sense_buffer() changes and another patch for the 
scsi_set_sense_information() changes. Please also add a statement that 
triggers a kernel warning if an out-of-range key value is passed to 
scsi_build_sense_buffer() instead of ignoring out-of-range sense key 
values silently.

Thanks,

Bart.


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sagi Grimberg Aug. 11, 2015, 6:49 a.m. UTC | #2
> -		put_unaligned_be64(info, &buf[3]);
> +		/*
> +		 * Fixed format sense reserves only 32 bits for the
> +		 * 'information' field
> +		 */
> +		put_unaligned_be32((u32)info, &buf[3]);
>   	}
>   }
>   EXPORT_SYMBOL(scsi_set_sense_information);
>

Hannes,

This bit is handled in "scsi: Fix sense information setting in fixed 
sized format"
see http://permalink.gmane.org/gmane.linux.scsi/103115

Can you make it incremental to this patch?

James, I don't see it on the scsi tree, can you pick it up?

Sagi.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hannes Reinecke Aug. 13, 2015, 7:31 a.m. UTC | #3
On 08/11/2015 08:49 AM, Sagi Grimberg wrote:
> 
>> -        put_unaligned_be64(info, &buf[3]);
>> +        /*
>> +         * Fixed format sense reserves only 32 bits for the
>> +         * 'information' field
>> +         */
>> +        put_unaligned_be32((u32)info, &buf[3]);
>>       }
>>   }
>>   EXPORT_SYMBOL(scsi_set_sense_information);
>>
> 
> Hannes,
> 
> This bit is handled in "scsi: Fix sense information setting in fixed
> sized format"
> see http://permalink.gmane.org/gmane.linux.scsi/103115
> 
> Can you make it incremental to this patch?
> 
Sure, I will.

> James, I don't see it on the scsi tree, can you pick it up?
> 
James, please. The patch already has the required Reviewed-by tags.

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 106884a..ba7ffc4 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -2510,13 +2510,13 @@  void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
 {
 	if (desc) {
 		buf[0] = 0x72;	/* descriptor, current */
-		buf[1] = key;
+		buf[1] = key & 0x0f;
 		buf[2] = asc;
 		buf[3] = ascq;
 		buf[7] = 0;
 	} else {
 		buf[0] = 0x70;	/* fixed, current */
-		buf[2] = key;
+		buf[2] = key & 0x0f;
 		buf[7] = 0xa;
 		buf[12] = asc;
 		buf[13] = ascq;
@@ -2549,7 +2549,11 @@  void scsi_set_sense_information(u8 *buf, u64 info)
 		put_unaligned_be64(info, &ucp[4]);
 	} else if ((buf[0] & 0x7f) == 0x70) {
 		buf[0] |= 0x80;
-		put_unaligned_be64(info, &buf[3]);
+		/*
+		 * Fixed format sense reserves only 32 bits for the
+		 * 'information' field
+		 */
+		put_unaligned_be32((u32)info, &buf[3]);
 	}
 }
 EXPORT_SYMBOL(scsi_set_sense_information);