mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
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.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user