On Tue, 2016-10-25 at 15:16 -0700, Bart Van Assche wrote: > On 10/23/2016 08:20 PM, Gabriel Krisman Bertazi wrote: > > + > > /** > > * scsi_execute - insert request and wait for the result > > * @sdev: scsi device > > @@ -187,7 +197,14 @@ int scsi_execute(struct scsi_device *sdev, > > const unsigned char *cmd, > > struct request *req; > > int write = (data_direction == DMA_TO_DEVICE); > > int ret = DRIVER_ERROR << 24; > > + unsigned char sense_buf[SCSI_SENSE_BUFFERSIZE]; > > > > + if (!sense) { > > + sense = sense_buf; > > + memset(sense, 0, SCSI_SENSE_BUFFERSIZE); > > + } > > + > > + retry: > > req = blk_get_request(sdev->request_queue, write, > > __GFP_RECLAIM); > > if (IS_ERR(req)) > > return ret; > > @@ -210,6 +227,13 @@ int scsi_execute(struct scsi_device *sdev, > > const unsigned char *cmd, > > */ > > blk_execute_rq(req->q, NULL, req, 1); > > > > + if (scsi_sense_unit_attention(sense) && req->retries > 0) > > { > > + memset(sense, 0, SCSI_SENSE_BUFFERSIZE); > > + retries = req->retries - 1; > > + blk_put_request(req); > > + goto retry; > > + } > > + > > /* > > * Some devices (USB mass-storage in particular) may > > transfer > > * garbage data together with a residue indicating that > > the data > > From scsi_io_completion(): > > if (sense_valid && !sense_deferred) { > switch (sshdr.sense_key) { > case UNIT_ATTENTION: > if (cmd->device->removable) { > cmd->device->changed = 1; > action = ACTION_FAIL; > } else { > action = ACTION_RETRY; > } > [ ... ] > > Why do you think new retry code is needed in scsi_execute()? Because scsi_execute uses REQ_BLOCK_PC which is completed before you get to that code. James -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html