On 7/31/24 8:33 PM, Damien Le Moal wrote:
Looking at the code, e.g. sd_start_stop_device(): res = scsi_execute_cmd(sdp, cmd, REQ_OP_DRV_IN, NULL, 0, SD_TIMEOUT, sdkp->max_retries, &exec_args); It seems that it is expected that the retry count will be honored. But that indeed is not the case as scsi_noretry_cmd() will always return false for REQ_OP_DRV_* commands. So may be we should have a RQF_USER_OP_DRV flag to differentiate user REQ_OP_DRV_* passthrough commands from internally issued REQ_OP_DRV_* commands. Or the reverse flag, e.g. RQF_INTERNAL_OP_DRV, that we can set in e.g. scsi_execute_cmnd().
Hmm ... how about using the simplest possible patch? The patch below seems to work fine. Thanks, Bart. [PATCH] scsi: core: Retry commands submitted by the SCSI core Pass-through commands either come from user space (SG_IO ioctl, SCSI_IOCTL_*, BSG), from the SCSI core or from a SCSI driver (ch, cxlflash, pktcdvd, scsi_scan, scsi_dh_*, scsi_transport_spi, sd, sg, st, virtio_scsi). All this code sets scsi_cmnd.allowed to the maximum number of allowed retries. Hence, removing the blk_rq_is_passthrough() check from scsi_noretry_cmd() has the effect that scsi_cmnd.allowed is respected for pass-through commands. diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 612489afe8d2..c09f65cfa898 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1855,7 +1855,7 @@ bool scsi_noretry_cmd(struct scsi_cmnd *scmd) * assume caller has checked sense and determined * the check condition was retryable. */ - if (req->cmd_flags & REQ_FAILFAST_DEV || blk_rq_is_passthrough(req)) + if (req->cmd_flags & REQ_FAILFAST_DEV) return true; return false;