mbox series

[RFC,PATCHv2,00/39] SCSI result cleanup, part 2

Message ID 20210423113944.42672-1-hare@suse.de
Headers show
Series SCSI result cleanup, part 2 | expand

Message

Hannes Reinecke April 23, 2021, 11:39 a.m. UTC
Hi all,

here is now my alternative approach on how the SCSI result could be
cleaned up. It's based on the observation that two fields (namely
driver_byte and message_byte) are essentially unused.
The driver byte really is an unloved thing, with very few drivers
using it, and not really consistent, either.
It's only DRIVER_SENSE which has a meaning for userspace, and that
just indicates if a sense code is present; as such it can easily
inferred by looking at the sense code itself.
The message byte is a different story, as it's being used internally
by some SCSI parallel drivers. But even here, in the end the message
byte is only ever relevant for SCSI EH, and that just checks if
any message byte is set apart from COMMAND_COMPLETE.
And we have the SCp.Message field, which can be used to hold the
message values for drivers which had been using the message byte
in the SCSI result. If we do that the message byte itself becomes
irrelevant and can be dropped, too.

So with this approach we can stop using the driver_byte and the
message_byte values in the SCSI result, which means we only
have two values (host byte and status byte) left to deal with.

My plan here is move every driver to use accessors for the
remaining bytes in the SCSI result, and with that move the
SCSI result over into two separate values.

A patchset implementing this can be found at:

git://git.kernel.org/pub/scm/linux/kernel/hare/scsi-devel.git
scsi-result-rework

This patchset is the first part of that, and is intentionally posted
as an RFC as it directly competes with Barts patchset.

As it has been noted that there is a confusion between
'status_byte()' (which returns the linux status code) and
'get_status_byte()' (which returns the SAM status code) I've
added another patch to rip out the linux-specific SCSI
status code; they have been obsoleted years ago and it's
time for them to go.

As usual, comments and reviews are welcome.

Changes to v1:
- Drop patches not relevant to this series
- Include reviews from Bart and Doug Gilbert
- Add patch to remove status_byte()

Hannes Reinecke (39):
  st: return error code in st_scsi_execute()
  scsi_ioctl: return error code when blk_rq_map_kern() fails
  scsi_dh_alua: do not interpret DRIVER_ERROR
  scsi: Fixup calling convention for scsi_mode_sense()
  scsi: stop using DRIVER_ERROR
  scsi: introduce scsi_build_sense()
  scsi: introduce scsi_status_is_check_condition()
  scsi: Kill DRIVER_SENSE
  scsi: do not use DRIVER_INVALID
  scsi_error: use DID_TIME_OUT instead of DRIVER_TIMEOUT
  xen-scsiback: use DID_ERROR instead of DRIVER_ERROR
  xen-scsifront: compability status handling
  scsi: Drop the now obsolete driver_byte definitions
  NCR5380: Fold SCSI message ABORT onto DID_ABORT
  scsi: add get_{status,host}_byte() accessor function
  scsi: add translate_msg_byte()
  dc395: use standard macros to set SCSI result
  dc395: translate message bytes
  qlogicfas408: make ql_pcmd() a void function
  qlogicfas408: whitespace cleanup
  qlogicfas408: translate message to host byte status
  nsp32: whitespace cleanup
  nsp32: do not set message byte
  wd33c93: translate message byte to host byte
  mesh: translate message to host byte status
  acornscsi: remove acornscsi_reportstatus()
  acornscsi: translate message byte to host byte
  aha152x: modify done() to use separate status bytes
  aha152x: do not set message byte when calling scsi_done()
  advansys: do not set message byte in SCSI status
  fas216: translate message to host byte status
  fas216: Use get_status_byte() to avoid using linux-specific status
    codes
  FlashPoint: Use standard SCSI definitions
  fdomain: drop last argument to fdomain_finish_cmd()
  fdomain: translate message to host byte status
  scsi: drop message byte helper
  scsi: kill message byte
  target: use standard SAM status types
  scsi: drop obsolete linux-specific SCSI status codes

 Documentation/scsi/scsi_mid_low_api.rst     |   7 +-
 block/bsg-lib.c                             |   2 +-
 block/bsg.c                                 |   4 +-
 block/scsi_ioctl.c                          |  13 +-
 drivers/ata/libata-scsi.c                   |  30 +-
 drivers/infiniband/ulp/srp/ib_srp.c         |   2 +-
 drivers/s390/scsi/zfcp_scsi.c               |   5 +-
 drivers/scsi/3w-9xxx.c                      |   2 +-
 drivers/scsi/3w-xxxx.c                      |   6 +-
 drivers/scsi/53c700.c                       |   6 +-
 drivers/scsi/FlashPoint.c                   | 165 ++++----
 drivers/scsi/NCR5380.c                      |  10 +-
 drivers/scsi/advansys.c                     |   4 -
 drivers/scsi/aha152x.c                      |  33 +-
 drivers/scsi/aic7xxx/aic79xx_osm.c          |  19 +-
 drivers/scsi/aic7xxx/aic7xxx_osm.c          |   1 -
 drivers/scsi/arcmsr/arcmsr_hba.c            |   5 +-
 drivers/scsi/arm/acornscsi.c                |  46 +--
 drivers/scsi/arm/fas216.c                   |  15 +-
 drivers/scsi/ch.c                           |   5 +-
 drivers/scsi/constants.c                    |  15 -
 drivers/scsi/cxlflash/superpipe.c           |   3 +-
 drivers/scsi/dc395x.c                       |  80 ++--
 drivers/scsi/device_handler/scsi_dh_alua.c  |   4 -
 drivers/scsi/esas2r/esas2r_main.c           |   2 +-
 drivers/scsi/esp_scsi.c                     |   4 +-
 drivers/scsi/fdomain.c                      |  22 +-
 drivers/scsi/hptiop.c                       |   2 +-
 drivers/scsi/ibmvscsi/ibmvscsi.c            |   2 +-
 drivers/scsi/libiscsi.c                     |   5 +-
 drivers/scsi/lpfc/lpfc_scsi.c               |  54 +--
 drivers/scsi/megaraid.c                     |  20 +-
 drivers/scsi/megaraid/megaraid_mbox.c       |  25 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   |   2 -
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   1 -
 drivers/scsi/mesh.c                         |   9 +-
 drivers/scsi/mpt3sas/mpt3sas_scsih.c        |  14 +-
 drivers/scsi/mvumi.c                        |  10 +-
 drivers/scsi/myrb.c                         |  64 +--
 drivers/scsi/myrs.c                         |   9 +-
 drivers/scsi/nsp32.c                        | 419 +++++++++++---------
 drivers/scsi/ps3rom.c                       |   7 +-
 drivers/scsi/qla2xxx/qla_isr.c              |  15 +-
 drivers/scsi/qlogicfas408.c                 | 137 ++++---
 drivers/scsi/scsi.c                         |  11 +-
 drivers/scsi/scsi_debug.c                   |  15 +-
 drivers/scsi/scsi_error.c                   |  70 ++--
 drivers/scsi/scsi_ioctl.c                   |   7 +-
 drivers/scsi/scsi_lib.c                     |  59 ++-
 drivers/scsi/scsi_logging.c                 |  10 +-
 drivers/scsi/scsi_scan.c                    |   6 +-
 drivers/scsi/scsi_transport_sas.c           |   9 +-
 drivers/scsi/scsi_transport_spi.c           |   2 +-
 drivers/scsi/sd.c                           |  63 +--
 drivers/scsi/sd_zbc.c                       |   3 +-
 drivers/scsi/sg.c                           |  11 +-
 drivers/scsi/smartpqi/smartpqi_init.c       |   3 +-
 drivers/scsi/sr.c                           |   4 +-
 drivers/scsi/sr_ioctl.c                     |   6 +-
 drivers/scsi/st.c                           |   8 +-
 drivers/scsi/stex.c                         |   9 +-
 drivers/scsi/sym53c8xx_2/sym_glue.c         |   6 +-
 drivers/scsi/ufs/ufshcd.c                   |   2 +-
 drivers/scsi/virtio_scsi.c                  |   5 +-
 drivers/scsi/vmw_pvscsi.c                   |   6 -
 drivers/scsi/wd33c93.c                      |  46 ++-
 drivers/scsi/xen-scsifront.c                |   8 +-
 drivers/target/loopback/tcm_loop.c          |   1 -
 drivers/target/target_core_alua.c           |   6 +-
 drivers/target/target_core_iblock.c         |   2 +-
 drivers/target/target_core_pr.c             |   8 +-
 drivers/target/target_core_pscsi.c          |   2 +-
 drivers/target/target_core_sbc.c            |  10 +-
 drivers/target/target_core_spc.c            |  14 +-
 drivers/target/target_core_xcopy.c          |   2 +-
 drivers/usb/storage/cypress_atacb.c         |   4 +-
 drivers/xen/xen-scsiback.c                  |  17 +-
 include/scsi/scsi.h                         |  37 +-
 include/scsi/scsi_cmnd.h                    |  29 +-
 include/scsi/scsi_proto.h                   |  22 +-
 include/scsi/sg.h                           |  24 ++
 include/trace/events/scsi.h                 |  48 +--
 82 files changed, 859 insertions(+), 1041 deletions(-)

Comments

Finn Thain April 24, 2021, 9:20 a.m. UTC | #1
On Fri, 23 Apr 2021, Hannes Reinecke wrote:

> Instead of setting the message byte translate it to the appropriate

> host byte. As error recovery would return DID_ERROR for any non-zero

> message byte the translation doesn't change the error handling.

> 

> Signed-off-by: Hannes Reinecke <hare@suse.de>

> ---

>  drivers/scsi/wd33c93.c | 46 ++++++++++++++++++++++++------------------

>  1 file changed, 26 insertions(+), 20 deletions(-)

> 

> diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c

> index a23277bb870e..187b363db00e 100644

> --- a/drivers/scsi/wd33c93.c

> +++ b/drivers/scsi/wd33c93.c

> @@ -1176,13 +1176,14 @@ wd33c93_intr(struct Scsi_Host *instance)

>  			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)

>  				cmd->SCp.Status = lun;

>  			if (cmd->cmnd[0] == REQUEST_SENSE

> -			    && cmd->SCp.Status != SAM_STAT_GOOD)

> -				cmd->result =

> -				    (cmd->

> -				     result & 0x00ffff) | (DID_ERROR << 16);

> -			else

> -				cmd->result =

> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

> +				set_host_byte(cmd, DID_ERROR);

> +				set_status_byte(cmd, SAM_STAT_GOOD);

> +			} else {

> +				set_host_byte(cmd, DID_OK);

> +				translate_msg_byte(cmd, cmd->SCp.Message);

> +				set_status_byte(cmd, cmd->SCp.Status);

> +			}

>  			cmd->scsi_done(cmd);

>  

>  /* We are no longer  connected to a target - check to see if

> @@ -1262,11 +1263,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>  		    hostdata->connected = NULL;

>  		hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>  		hostdata->state = S_UNCONNECTED;

> -		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != SAM_STAT_GOOD)

> -			cmd->result =

> -			    (cmd->result & 0x00ffff) | (DID_ERROR << 16);

> -		else

> -			cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);

> +		if (cmd->cmnd[0] == REQUEST_SENSE &&

> +		    cmd->SCp.Status != SAM_STAT_GOOD) {

> +			set_host_byte(cmd, DID_ERROR);

> +			set_status_byte(cmd, SAM_STAT_GOOD);

> +		} else {

> +			set_host_byte(cmd, DID_OK);

> +			translate_msg_byte(cmd, cmd->SCp.Message);

> +			set_status_byte(cmd, cmd->SCp.Status);

> +		}

>  		cmd->scsi_done(cmd);

>  

>  /* We are no longer connected to a target - check to see if

> @@ -1295,14 +1300,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>  			hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>  			hostdata->state = S_UNCONNECTED;

>  			DB(DB_INTR, printk(":%d", cmd->SCp.Status))

> -			    if (cmd->cmnd[0] == REQUEST_SENSE

> -				&& cmd->SCp.Status != SAM_STAT_GOOD)

> -				cmd->result =

> -				    (cmd->

> -				     result & 0x00ffff) | (DID_ERROR << 16);

> -			else

> -				cmd->result =

> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

> +			if (cmd->cmnd[0] == REQUEST_SENSE

> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

> +				set_host_byte(cmd, DID_ERROR);

> +				set_status_byte(cmd, SAM_STAT_GOOD);

> +			} else {

> +				set_host_byte(cmd, DID_OK);

> +				translate_msg_byte(cmd, cmd->SCp.Message);

> +				set_status_byte(cmd, cmd->SCp.Status);

> +			}

>  			cmd->scsi_done(cmd);

>  			break;

>  		case S_PRE_TMP_DISC:

> 


I think these three hunks all have the same mistake, which would force 
SAM_STAT_GOOD.
Hannes Reinecke April 26, 2021, 9:07 a.m. UTC | #2
On 4/24/21 11:20 AM, Finn Thain wrote:
> On Fri, 23 Apr 2021, Hannes Reinecke wrote:

> 

>> Instead of setting the message byte translate it to the appropriate

>> host byte. As error recovery would return DID_ERROR for any non-zero

>> message byte the translation doesn't change the error handling.

>>

>> Signed-off-by: Hannes Reinecke <hare@suse.de>

>> ---

>>  drivers/scsi/wd33c93.c | 46 ++++++++++++++++++++++++------------------

>>  1 file changed, 26 insertions(+), 20 deletions(-)

>>

>> diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c

>> index a23277bb870e..187b363db00e 100644

>> --- a/drivers/scsi/wd33c93.c

>> +++ b/drivers/scsi/wd33c93.c

>> @@ -1176,13 +1176,14 @@ wd33c93_intr(struct Scsi_Host *instance)

>>  			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)

>>  				cmd->SCp.Status = lun;

>>  			if (cmd->cmnd[0] == REQUEST_SENSE

>> -			    && cmd->SCp.Status != SAM_STAT_GOOD)

>> -				cmd->result =

>> -				    (cmd->

>> -				     result & 0x00ffff) | (DID_ERROR << 16);

>> -			else

>> -				cmd->result =

>> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

>> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

>> +				set_host_byte(cmd, DID_ERROR);

>> +				set_status_byte(cmd, SAM_STAT_GOOD);

>> +			} else {

>> +				set_host_byte(cmd, DID_OK);

>> +				translate_msg_byte(cmd, cmd->SCp.Message);

>> +				set_status_byte(cmd, cmd->SCp.Status);

>> +			}

>>  			cmd->scsi_done(cmd);

>>  

>>  /* We are no longer  connected to a target - check to see if

>> @@ -1262,11 +1263,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>>  		    hostdata->connected = NULL;

>>  		hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>>  		hostdata->state = S_UNCONNECTED;

>> -		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != SAM_STAT_GOOD)

>> -			cmd->result =

>> -			    (cmd->result & 0x00ffff) | (DID_ERROR << 16);

>> -		else

>> -			cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);

>> +		if (cmd->cmnd[0] == REQUEST_SENSE &&

>> +		    cmd->SCp.Status != SAM_STAT_GOOD) {

>> +			set_host_byte(cmd, DID_ERROR);

>> +			set_status_byte(cmd, SAM_STAT_GOOD);

>> +		} else {

>> +			set_host_byte(cmd, DID_OK);

>> +			translate_msg_byte(cmd, cmd->SCp.Message);

>> +			set_status_byte(cmd, cmd->SCp.Status);

>> +		}

>>  		cmd->scsi_done(cmd);

>>  

>>  /* We are no longer connected to a target - check to see if

>> @@ -1295,14 +1300,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>>  			hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>>  			hostdata->state = S_UNCONNECTED;

>>  			DB(DB_INTR, printk(":%d", cmd->SCp.Status))

>> -			    if (cmd->cmnd[0] == REQUEST_SENSE

>> -				&& cmd->SCp.Status != SAM_STAT_GOOD)

>> -				cmd->result =

>> -				    (cmd->

>> -				     result & 0x00ffff) | (DID_ERROR << 16);

>> -			else

>> -				cmd->result =

>> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

>> +			if (cmd->cmnd[0] == REQUEST_SENSE

>> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

>> +				set_host_byte(cmd, DID_ERROR);

>> +				set_status_byte(cmd, SAM_STAT_GOOD);

>> +			} else {

>> +				set_host_byte(cmd, DID_OK);

>> +				translate_msg_byte(cmd, cmd->SCp.Message);

>> +				set_status_byte(cmd, cmd->SCp.Status);

>> +			}

>>  			cmd->scsi_done(cmd);

>>  			break;

>>  		case S_PRE_TMP_DISC:

>>

> 

> I think these three hunks all have the same mistake, which would force 

> SAM_STAT_GOOD.

> 

Which mistake was that again?

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		        Kernel Storage Architect
hare@suse.de			               +49 911 74053 688
SUSE Software Solutions Germany GmbH, 90409 Nürnberg
GF: F. Imendörffer, HRB 36809 (AG Nürnberg)
Finn Thain April 27, 2021, 4:39 a.m. UTC | #3
On Mon, 26 Apr 2021, Hannes Reinecke wrote:

> On 4/24/21 11:20 AM, Finn Thain wrote:

> > On Fri, 23 Apr 2021, Hannes Reinecke wrote:

> > 

> >> Instead of setting the message byte translate it to the appropriate

> >> host byte. As error recovery would return DID_ERROR for any non-zero

> >> message byte the translation doesn't change the error handling.

> >>

> >> Signed-off-by: Hannes Reinecke <hare@suse.de>

> >> ---

> >>  drivers/scsi/wd33c93.c | 46 ++++++++++++++++++++++++------------------

> >>  1 file changed, 26 insertions(+), 20 deletions(-)

> >>

> >> diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c

> >> index a23277bb870e..187b363db00e 100644

> >> --- a/drivers/scsi/wd33c93.c

> >> +++ b/drivers/scsi/wd33c93.c

> >> @@ -1176,13 +1176,14 @@ wd33c93_intr(struct Scsi_Host *instance)

> >>  			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)

> >>  				cmd->SCp.Status = lun;

> >>  			if (cmd->cmnd[0] == REQUEST_SENSE

> >> -			    && cmd->SCp.Status != SAM_STAT_GOOD)

> >> -				cmd->result =

> >> -				    (cmd->

> >> -				     result & 0x00ffff) | (DID_ERROR << 16);

> >> -			else

> >> -				cmd->result =

> >> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

> >> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

> >> +				set_host_byte(cmd, DID_ERROR);

> >> +				set_status_byte(cmd, SAM_STAT_GOOD);

> >> +			} else {

> >> +				set_host_byte(cmd, DID_OK);

> >> +				translate_msg_byte(cmd, cmd->SCp.Message);

> >> +				set_status_byte(cmd, cmd->SCp.Status);

> >> +			}

> >>  			cmd->scsi_done(cmd);

> >>  

> >>  /* We are no longer  connected to a target - check to see if

> >> @@ -1262,11 +1263,15 @@ wd33c93_intr(struct Scsi_Host *instance)

> >>  		    hostdata->connected = NULL;

> >>  		hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

> >>  		hostdata->state = S_UNCONNECTED;

> >> -		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != SAM_STAT_GOOD)

> >> -			cmd->result =

> >> -			    (cmd->result & 0x00ffff) | (DID_ERROR << 16);

> >> -		else

> >> -			cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);

> >> +		if (cmd->cmnd[0] == REQUEST_SENSE &&

> >> +		    cmd->SCp.Status != SAM_STAT_GOOD) {

> >> +			set_host_byte(cmd, DID_ERROR);

> >> +			set_status_byte(cmd, SAM_STAT_GOOD);

> >> +		} else {

> >> +			set_host_byte(cmd, DID_OK);

> >> +			translate_msg_byte(cmd, cmd->SCp.Message);

> >> +			set_status_byte(cmd, cmd->SCp.Status);

> >> +		}

> >>  		cmd->scsi_done(cmd);

> >>  

> >>  /* We are no longer connected to a target - check to see if

> >> @@ -1295,14 +1300,15 @@ wd33c93_intr(struct Scsi_Host *instance)

> >>  			hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

> >>  			hostdata->state = S_UNCONNECTED;

> >>  			DB(DB_INTR, printk(":%d", cmd->SCp.Status))

> >> -			    if (cmd->cmnd[0] == REQUEST_SENSE

> >> -				&& cmd->SCp.Status != SAM_STAT_GOOD)

> >> -				cmd->result =

> >> -				    (cmd->

> >> -				     result & 0x00ffff) | (DID_ERROR << 16);

> >> -			else

> >> -				cmd->result =

> >> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

> >> +			if (cmd->cmnd[0] == REQUEST_SENSE

> >> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

> >> +				set_host_byte(cmd, DID_ERROR);

> >> +				set_status_byte(cmd, SAM_STAT_GOOD);

> >> +			} else {

> >> +				set_host_byte(cmd, DID_OK);

> >> +				translate_msg_byte(cmd, cmd->SCp.Message);

> >> +				set_status_byte(cmd, cmd->SCp.Status);

> >> +			}

> >>  			cmd->scsi_done(cmd);

> >>  			break;

> >>  		case S_PRE_TMP_DISC:

> >>

> > 

> > I think these three hunks all have the same mistake, which would force 

> > SAM_STAT_GOOD.

> > 

> Which mistake was that again?

> 


I noticed that the old code,
	cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
preserves the status byte whereas the new code clobbers it. This was not 
mentioned in the commit log.

Now that I've looked a bit deeper and failed to find any 
scsi_eh_prep_cmnd()/scsi_eh_restore_cmnd() that would complicate the 
cmd->cmnd[0] == REQUEST_SENSE comparison, I now think clobbering the 
status byte is harmless (though redundant).

So please disregard my objection. Sorry for the noise.
Hannes Reinecke April 27, 2021, 6:11 a.m. UTC | #4
On 4/27/21 6:39 AM, Finn Thain wrote:
> On Mon, 26 Apr 2021, Hannes Reinecke wrote:

> 

>> On 4/24/21 11:20 AM, Finn Thain wrote:

>>> On Fri, 23 Apr 2021, Hannes Reinecke wrote:

>>>

>>>> Instead of setting the message byte translate it to the appropriate

>>>> host byte. As error recovery would return DID_ERROR for any non-zero

>>>> message byte the translation doesn't change the error handling.

>>>>

>>>> Signed-off-by: Hannes Reinecke <hare@suse.de>

>>>> ---

>>>>   drivers/scsi/wd33c93.c | 46 ++++++++++++++++++++++++------------------

>>>>   1 file changed, 26 insertions(+), 20 deletions(-)

>>>>

>>>> diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c

>>>> index a23277bb870e..187b363db00e 100644

>>>> --- a/drivers/scsi/wd33c93.c

>>>> +++ b/drivers/scsi/wd33c93.c

>>>> @@ -1176,13 +1176,14 @@ wd33c93_intr(struct Scsi_Host *instance)

>>>>   			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)

>>>>   				cmd->SCp.Status = lun;

>>>>   			if (cmd->cmnd[0] == REQUEST_SENSE

>>>> -			    && cmd->SCp.Status != SAM_STAT_GOOD)

>>>> -				cmd->result =

>>>> -				    (cmd->

>>>> -				     result & 0x00ffff) | (DID_ERROR << 16);

>>>> -			else

>>>> -				cmd->result =

>>>> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

>>>> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

>>>> +				set_host_byte(cmd, DID_ERROR);

>>>> +				set_status_byte(cmd, SAM_STAT_GOOD);

>>>> +			} else {

>>>> +				set_host_byte(cmd, DID_OK);

>>>> +				translate_msg_byte(cmd, cmd->SCp.Message);

>>>> +				set_status_byte(cmd, cmd->SCp.Status);

>>>> +			}

>>>>   			cmd->scsi_done(cmd);

>>>>   

>>>>   /* We are no longer  connected to a target - check to see if

>>>> @@ -1262,11 +1263,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>>>>   		    hostdata->connected = NULL;

>>>>   		hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>>>>   		hostdata->state = S_UNCONNECTED;

>>>> -		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != SAM_STAT_GOOD)

>>>> -			cmd->result =

>>>> -			    (cmd->result & 0x00ffff) | (DID_ERROR << 16);

>>>> -		else

>>>> -			cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);

>>>> +		if (cmd->cmnd[0] == REQUEST_SENSE &&

>>>> +		    cmd->SCp.Status != SAM_STAT_GOOD) {

>>>> +			set_host_byte(cmd, DID_ERROR);

>>>> +			set_status_byte(cmd, SAM_STAT_GOOD);

>>>> +		} else {

>>>> +			set_host_byte(cmd, DID_OK);

>>>> +			translate_msg_byte(cmd, cmd->SCp.Message);

>>>> +			set_status_byte(cmd, cmd->SCp.Status);

>>>> +		}

>>>>   		cmd->scsi_done(cmd);

>>>>   

>>>>   /* We are no longer connected to a target - check to see if

>>>> @@ -1295,14 +1300,15 @@ wd33c93_intr(struct Scsi_Host *instance)

>>>>   			hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xff));

>>>>   			hostdata->state = S_UNCONNECTED;

>>>>   			DB(DB_INTR, printk(":%d", cmd->SCp.Status))

>>>> -			    if (cmd->cmnd[0] == REQUEST_SENSE

>>>> -				&& cmd->SCp.Status != SAM_STAT_GOOD)

>>>> -				cmd->result =

>>>> -				    (cmd->

>>>> -				     result & 0x00ffff) | (DID_ERROR << 16);

>>>> -			else

>>>> -				cmd->result =

>>>> -				    cmd->SCp.Status | (cmd->SCp.Message << 8);

>>>> +			if (cmd->cmnd[0] == REQUEST_SENSE

>>>> +			    && cmd->SCp.Status != SAM_STAT_GOOD) {

>>>> +				set_host_byte(cmd, DID_ERROR);

>>>> +				set_status_byte(cmd, SAM_STAT_GOOD);

>>>> +			} else {

>>>> +				set_host_byte(cmd, DID_OK);

>>>> +				translate_msg_byte(cmd, cmd->SCp.Message);

>>>> +				set_status_byte(cmd, cmd->SCp.Status);

>>>> +			}

>>>>   			cmd->scsi_done(cmd);

>>>>   			break;

>>>>   		case S_PRE_TMP_DISC:

>>>>

>>>

>>> I think these three hunks all have the same mistake, which would force

>>> SAM_STAT_GOOD.

>>>

>> Which mistake was that again?

>>

> 

> I noticed that the old code,

> 	cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);

> preserves the status byte whereas the new code clobbers it. This was not

> mentioned in the commit log.

> 

> Now that I've looked a bit deeper and failed to find any

> scsi_eh_prep_cmnd()/scsi_eh_restore_cmnd() that would complicate the

> cmd->cmnd[0] == REQUEST_SENSE comparison, I now think clobbering the

> status byte is harmless (though redundant).

> 

> So please disregard my objection. Sorry for the noise.

> 

Ah. Right. Guess we are both right, then.

Yes, you are right in your objection that my code clobbers the status 
byte in the DID_ERROR case.
But that would be irrelevant as SCSI EH will disregard the status code 
anyway if the host byte is set.
But in either case, I'll be fixup up the patch to not clobber the status 
code here.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer