On Fri, Jul 20, 2018 at 03:12:59PM +0000, Bart Van Assche wrote: > On Thu, 2018-07-19 at 15:26 -0600, Keith Busch wrote: > > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c > > index 8932ae81a15a..86ee10b2c775 100644 > > --- a/drivers/scsi/scsi_error.c > > +++ b/drivers/scsi/scsi_error.c > > @@ -286,6 +286,9 @@ enum blk_eh_timer_return scsi_times_out(struct request *req) > > enum blk_eh_timer_return rtn = BLK_EH_DONE; > > struct Scsi_Host *host = scmd->device->host; > > > > + if (req->q->mq_ops && blk_mq_mark_complete(req)) > > + return rtn; > > + > > trace_scsi_dispatch_cmd_timeout(scmd); > > scsi_log_completion(scmd, TIMEOUT_ERROR); > > > > @@ -300,7 +303,8 @@ enum blk_eh_timer_return scsi_times_out(struct request *req) > > set_host_byte(scmd, DID_TIME_OUT); > > scsi_eh_scmd_add(scmd); > > } > > - } > > + } else if (req->q->mq_ops) > > + WRITE_ONCE(req->state, MQ_RQ_IN_FLIGHT); > > > > return rtn; > > } > > Modifying the completion state and req->state from the SCSI core are layering > violations. Have you considered to move the above changes into blk_mq_rq_timed_out()? > An additional benefit of that approach is that the req->q->mq_ops checks can be > left out. SCSI is the only block driver that wants this behavior. Moving it back to generic where it used to be breaks other block drivers.