Re: [PATCH] [SCSI] scsi_lib: fix scsi_io_completion's SG_IO error propagation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Il 31/05/2012 21:05, Mike Snitzer ha scritto:
> The following v3.4-rc1 commit unmasked an existing bug in
> scsi_io_completion's SG_IO error handling:
> 47ac56d [SCSI] scsi_error: classify some ILLEGAL_REQUEST sense as a permanent TARGET_ERROR
> 
> Given that certain ILLEGAL_REQUEST are now properly categorized as
> TARGET_ERROR the host_byte is being set (before host_byte wasn't ever
> set for these ILLEGAL_REQUEST).
> 
> In scsi_io_completion, initialize req->errors with cmd->result _after_
> the SG_IO block that calls __scsi_error_from_host_byte (which may
> modify the host_byte).
> 
> Before this fix:
> 
>     cdb to send: 12 01 01 00 00 00
> ioctl(3, SG_IO, {'S', SG_DXFER_NONE, cmd[6]=[12, 01, 01, 00, 00, 00],
>     mx_sb_len=32, iovec_count=0, dxfer_len=0, timeout=20000, flags=0,
>     status=02, masked_status=01, sb[19]=[70, 00, 05, 00, 00, 00, 00, 0b,
>     00, 00, 00, 00, 24, 00, 00, 00, 00, 00, 00], host_status=0x10,
>     driver_status=0x8, resid=0, duration=0, info=0x1}) = 0
> SCSI Status: Check Condition
> 
> Sense Information:
> sense buffer empty
> 
> After:
> 
>     cdb to send: 12 01 01 00 00 00
> ioctl(3, SG_IO, {'S', SG_DXFER_NONE, cmd[6]=[12, 01, 01, 00, 00, 00],
>     mx_sb_len=32, iovec_count=0, dxfer_len=0, timeout=20000, flags=0,
>     status=02, masked_status=01, sb[19]=[70, 00, 05, 00, 00, 00, 00, 0b,
>     00, 00, 00, 00, 24, 00, 00, 00, 00, 00, 00], host_status=0,
>     driver_status=0x8, resid=0, duration=0, info=0x1}) = 0
> SCSI Status: Check Condition
> 
> Sense Information:
>  Fixed format, current;  Sense key: Illegal Request
>  Additional sense: Invalid field in cdb
>  Raw sense data (in hex):
>         70 00 05 00 00 00 00 0b  00 00 00 00 24 00 00 00
>         00 00 00
> 
> Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx>
> Reviewed-by: Babu Moger <babu.moger@xxxxxxxxxx>

Reported-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
Tested-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>

Paolo

> Cc: stable@xxxxxxxxxxxxxxx # 3.4
> ---
>  drivers/scsi/scsi_lib.c |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 5dfd749..8db7ef0 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -753,7 +753,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
>  	}
>  
>  	if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */
> -		req->errors = result;
>  		if (result) {
>  			if (sense_valid && req->sense) {
>  				/*
> @@ -769,6 +768,10 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
>  			if (!sense_deferred)
>  				error = __scsi_error_from_host_byte(cmd, result);
>  		}
> +		/*
> +		 * __scsi_error_from_host_byte may have reset the host_byte
> +		 */
> +		req->errors = cmd->result;
>  
>  		req->resid_len = scsi_get_resid(cmd);
>  

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux