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

Reply via email to