[PATCH v2 31/35] scsi: sd: Have sd_pr_command retry UAs

Mike Christie
2022-09-29T02:55:50Z

It's common to get a UA when doing PR commands. It could be due to a
target restarting, transport level relogin or other PR commands like a
release causing it. The upper layers don't get the sense and in some cases
have no idea if it's a SCSI device, so this has the sd layer retry.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
drivers/scsi/sd.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index cacfdde545f3..e7c7992b7bf3 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1723,6 +1723,16 @@ static int sd_pr_command(struct block_device *bdev, u8 sa,
int result;
u8 cmd[16] = { 0, };
u8 data[24] = { 0, };
+ struct scsi_failure failures[] = {
+ {
+ .sense = UNIT_ATTENTION,
+ .asc = SCMD_FAILURE_ASC_ANY,
+ .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .allowed = 5,
+ .result = SAM_STAT_CHECK_CONDITION,
+ },
+ {},
+ };

cmd[0] = PERSISTENT_RESERVE_OUT;
cmd[1] = sa;
@@ -1741,7 +1751,8 @@ static int sd_pr_command(struct block_device *bdev, u8 sa,
.buf_len = sizeof(data),
.sshdr = &sshdr,
.timeout = SD_TIMEOUT,
- .retries = sdkp->max_retries }));
+ .retries = sdkp->max_retries,
+ .failures = failures }));

if (scsi_status_is_check_condition(result) &&
scsi_sense_valid(&sshdr)) {
--
2.25.1