From 9442b2f78f17309bb1c2bca0df735728b03ee732 Mon Sep 17 00:00:00 2001 From: Wenchao Hao Date: Sun, 28 Aug 2022 16:44:56 +0800 Subject: scsi_id: retry inquiry ioctl if host_byte is DID_TRANSPORT_DISRUPTED The inquiry is issued to kernel via ioctl, kernelspace would set this inquiry command's retry count to 0 which means the command would not be retried in kernel space even if the LLDs returned a status which need to be retried. So we should take the retry in user space. --- src/udev/scsi_id/scsi_serial.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/udev/scsi_id/scsi_serial.c') diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c index cfc13feced..992d1cf25b 100644 --- a/src/udev/scsi_id/scsi_serial.c +++ b/src/udev/scsi_id/scsi_serial.c @@ -69,6 +69,7 @@ static const char hex_str[]="0123456789abcdef"; #define DID_NO_CONNECT 0x01 /* Unable to connect before timeout */ #define DID_BUS_BUSY 0x02 /* Bus remain busy until timeout */ #define DID_TIME_OUT 0x03 /* Timed out for some other reason */ +#define DID_TRANSPORT_DISRUPTED 0x0e /* Transport disrupted and should retry */ #define DRIVER_TIMEOUT 0x06 #define DRIVER_SENSE 0x08 /* Sense_buffer has been set */ @@ -79,6 +80,7 @@ static const char hex_str[]="0123456789abcdef"; #define SG_ERR_CAT_TIMEOUT 3 #define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */ #define SG_ERR_CAT_NOTSUPPORTED 5 /* Illegal / unsupported command */ +#define SG_ERR_CAT_RETRY 6 /* Command should be retried */ #define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */ #define SG_ERR_CAT_OTHER 99 /* Some other error/warning */ @@ -126,6 +128,8 @@ static int sg_err_category_new(int scsi_status, int msg_status, int if (host_status) { if (IN_SET(host_status, DID_NO_CONNECT, DID_BUS_BUSY, DID_TIME_OUT)) return SG_ERR_CAT_TIMEOUT; + if (host_status == DID_TRANSPORT_DISRUPTED) + return SG_ERR_CAT_RETRY; } if (driver_status) { if (driver_status == DRIVER_TIMEOUT) @@ -332,6 +336,8 @@ resend: case SG_ERR_CAT_RECOVERED: retval = 0; break; + case SG_ERR_CAT_RETRY: + break; default: if (dev_scsi->use_sg == 4) -- cgit v1.2.1