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()?
Bart.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html