mbox series

[v8,00/33] scsi: Allow scsi_execute users to control retries

Message ID 20230614071719.6372-1-michael.christie@oracle.com
Headers show
Series scsi: Allow scsi_execute users to control retries | expand

Message

Mike Christie June 14, 2023, 7:16 a.m. UTC
The following patches were made over Martin's 6.5 scsi-queue branch.
They allow scsi_execute_cmd users to control exactly which errors are
retried, so we can reduce the sense/sshd handling they have to do and
have it one place.

The patches allow scsi_execute_cmd users to pass in an array of failures
which they want retried/failed and also specify how many times they want
them retried. If we hit an error that the user did not specify then we drop
down to the default behavior. This allows us to remove almost all the
retry logic from scsi_execute_cmd users. We just have the special cases
where we want to retry with a difference size command or sleep between
retries.

v8:
- Rebase.
- Saw the discussion about the possible bug where callers are
accessing the sshdr when it's not setup, so I added some patches
for that since I was going over the same code.

v7:
- Rebase against scsi_execute_cmd patchset.

v6:
- Fix kunit build when it's built as a module but scsi is not.
- Drop [PATCH 17/35] scsi: ufshcd: Convert to scsi_exec_req because
  that driver no longer uses scsi_execute.
- Convert ufshcd to use the scsi_failures struct because it now just does
  direct retries and does not do it's own deadline timing.
- Add back memset in read_capacity_16.
- Remove memset in get_sectorsize and replace with { } to init buf.

v5:
- Fix spelling (made sure I ran checkpatch strict)
- Drop SCMD_FAILURE_NONE
- Rename SCMD_FAILURE_ANY
- Fix media_not_present handling where it was being retried instead of
failed.
- Fix ILLEGAL_REQUEST handling in read_capacity_16 so it was not retried.
- Fix coding style, spelling and and naming convention in kunit and added
  more tests to handle cases like the media_not_present one where we want
  to force failures instead of retries.
- Drop cxlflash patch because it actually checked it's internal state before
  performing a retry which we currently do not support.

v4:
- Redefine cmd definitions if the cmd is touched.
- Fix up coding style issues.
- Use sam_status enum.
- Move failures initialization to scsi_initialize_rq
(also fixes KASAN error).
- Add kunit test.
- Add function comments.

v3:
- Use a for loop in scsi_check_passthrough
- Fix result handling/testing.
- Fix scsi_status_is_good handling.
- make __scsi_exec_req take a const arg
- Fix formatting in patch 24

v2:
- Rename scsi_prep_sense
- Change scsi_check_passthrough's loop and added some fixes
- Modified scsi_execute* so it uses a struct to pass in args

Comments

Christoph Hellwig June 14, 2023, 2:33 p.m. UTC | #1
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Bart Van Assche June 14, 2023, 9:46 p.m. UTC | #2
On 6/14/23 00:17, Mike Christie wrote:
> If scsi_execute_cmd returns < 0 it will not have set the sshdr, so we
> can't access it.
> 
> Signed-off-by: Mike Christie <michael.christie@oracle.com>
> ---
>   drivers/scsi/scsi_transport_spi.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
> index 2442d4d2e3f3..2100c3adb456 100644
> --- a/drivers/scsi/scsi_transport_spi.c
> +++ b/drivers/scsi/scsi_transport_spi.c
> @@ -126,7 +126,7 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd,
>   		 */
>   		result = scsi_execute_cmd(sdev, cmd, opf, buffer, bufflen,
>   					  DV_TIMEOUT, 1, &exec_args);
> -		if (result < 0 || !scsi_sense_valid(sshdr) ||
> +		if (result <= 0 || !scsi_sense_valid(sshdr) ||
>   		    sshdr->sense_key != UNIT_ATTENTION)
>   			break;
>   	}

Hmm ... why is this change necessary? If result == 0 and args->sshdr != 
0 then scsi_execute() has called scsi_normalize_sense(). The first 
function call in scsi_normalize_sense() is memset(sshdr, 0, 
sizeof(struct scsi_sense_hdr)). Does this mean that it is safe to access 
the contents of sshdr if scsi_execute_cmd() returns 0?

Thanks,

Bart.
Mike Christie June 15, 2023, 5:01 p.m. UTC | #3
On 6/14/23 4:46 PM, Bart Van Assche wrote:
> On 6/14/23 00:17, Mike Christie wrote:
>> If scsi_execute_cmd returns < 0 it will not have set the sshdr, so we
>> can't access it.
>>
>> Signed-off-by: Mike Christie <michael.christie@oracle.com>
>> ---
>>   drivers/scsi/scsi_transport_spi.c | 6 +++---
>>   1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
>> index 2442d4d2e3f3..2100c3adb456 100644
>> --- a/drivers/scsi/scsi_transport_spi.c
>> +++ b/drivers/scsi/scsi_transport_spi.c
>> @@ -126,7 +126,7 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd,
>>            */
>>           result = scsi_execute_cmd(sdev, cmd, opf, buffer, bufflen,
>>                         DV_TIMEOUT, 1, &exec_args);
>> -        if (result < 0 || !scsi_sense_valid(sshdr) ||
>> +        if (result <= 0 || !scsi_sense_valid(sshdr) ||
>>               sshdr->sense_key != UNIT_ATTENTION)
>>               break;
>>       }
> 
> Hmm ... why is this change necessary?

It's not needed. Will drop.

I think when reviewing sshdr code I thought it was a waste to check for sense
when result was zero. When I broke up the set, it got caught in the sshdr fixes.
Will drop since not related.
Christoph Hellwig June 16, 2023, 7:17 a.m. UTC | #4
On Wed, Jun 14, 2023 at 02:17:01AM -0500, Mike Christie wrote:
> If scsi_execute_cmd returns < 0 it will not have set the sshdr, so we
> can't access it.

Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:18 a.m. UTC | #5
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:18 a.m. UTC | #6
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:19 a.m. UTC | #7
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:20 a.m. UTC | #8
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:21 a.m. UTC | #9
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:22 a.m. UTC | #10
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:22 a.m. UTC | #11
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:23 a.m. UTC | #12
On Wed, Jun 14, 2023 at 02:17:16AM -0500, Mike Christie wrote:
> If scsi_execute_cmd returns < 0 it will not have set the sshdr, so we
> can't access it.

Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Christoph Hellwig June 16, 2023, 7:23 a.m. UTC | #13
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>