scsi: ch: Have midlayer retry ch_do_scsi() UAs
This has ch_do_scsi() have the SCSI midlayer retry UAs instead of driving them itself. Signed-off-by: Mike Christie <michael.christie@oracle.com> Link: https://lore.kernel.org/r/20240123002220.129141-12-michael.christie@oracle.com Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
11a2672321
commit
e11f35c46e
@ -185,17 +185,29 @@ static int
|
||||
ch_do_scsi(scsi_changer *ch, unsigned char *cmd, int cmd_len,
|
||||
void *buffer, unsigned int buflength, enum req_op op)
|
||||
{
|
||||
int errno, retries = 0, timeout, result;
|
||||
int errno = 0, timeout, result;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
struct scsi_failure failure_defs[] = {
|
||||
{
|
||||
.sense = UNIT_ATTENTION,
|
||||
.asc = SCMD_FAILURE_ASC_ANY,
|
||||
.ascq = SCMD_FAILURE_ASCQ_ANY,
|
||||
.allowed = 3,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
{}
|
||||
};
|
||||
struct scsi_failures failures = {
|
||||
.failure_definitions = failure_defs,
|
||||
};
|
||||
const struct scsi_exec_args exec_args = {
|
||||
.sshdr = &sshdr,
|
||||
.failures = &failures,
|
||||
};
|
||||
|
||||
timeout = (cmd[0] == INITIALIZE_ELEMENT_STATUS)
|
||||
? timeout_init : timeout_move;
|
||||
|
||||
retry:
|
||||
errno = 0;
|
||||
result = scsi_execute_cmd(ch->device, cmd, op, buffer, buflength,
|
||||
timeout * HZ, MAX_RETRIES, &exec_args);
|
||||
if (result < 0)
|
||||
@ -204,13 +216,6 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd, int cmd_len,
|
||||
if (debug)
|
||||
scsi_print_sense_hdr(ch->device, ch->name, &sshdr);
|
||||
errno = ch_find_errno(&sshdr);
|
||||
|
||||
switch(sshdr.sense_key) {
|
||||
case UNIT_ATTENTION:
|
||||
if (retries++ < 3)
|
||||
goto retry;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return errno;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user