scsi_dh_alua: return standard SCSI return codes in submit_rtpg
authorHannes Reinecke <hare@suse.de>
Tue, 1 Dec 2015 09:16:48 +0000 (10:16 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Dec 2015 21:34:55 +0000 (16:34 -0500)
Fixup submit_rtpg() to always return a standard SCSI return code.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Ewan Milne <emilne@redhat.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/device_handler/scsi_dh_alua.c

index 63824992532ec274a0d1952b95090d4c2567361d..e28abf05293b81ac8fc73627aaab0c570d19a666 100644 (file)
@@ -138,11 +138,13 @@ static unsigned submit_rtpg(struct scsi_device *sdev, struct alua_dh_data *h,
                            bool rtpg_ext_hdr_req)
 {
        struct request *rq;
-       int err = SCSI_DH_RES_TEMP_UNAVAIL;
+       int err = 0;
 
        rq = get_alua_req(sdev, h->buff, h->bufflen, READ);
-       if (!rq)
+       if (!rq) {
+               err = DRIVER_BUSY << 24;
                goto done;
+       }
 
        /* Prepare the command. */
        rq->cmd[0] = MAINTENANCE_IN;
@@ -160,13 +162,9 @@ static unsigned submit_rtpg(struct scsi_device *sdev, struct alua_dh_data *h,
        memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
        rq->sense_len = 0;
 
-       err = blk_execute_rq(rq->q, NULL, rq, 1);
-       if (err == -EIO) {
-               sdev_printk(KERN_INFO, sdev,
-                           "%s: rtpg failed with %x\n",
-                           ALUA_DH_NAME, rq->errors);
-               err = SCSI_DH_IO;
-       }
+       blk_execute_rq(rq->q, NULL, rq, 1);
+       if (rq->errors)
+               err = rq->errors;
        blk_put_request(rq);
 done:
        return err;
@@ -493,7 +491,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h, int wait_
        struct scsi_sense_hdr sense_hdr;
        int len, k, off, valid_states = 0;
        unsigned char *ucp;
-       unsigned err;
+       unsigned err, retval;
        bool rtpg_ext_hdr_req = 1;
        unsigned long expiry, interval = 0;
        unsigned int tpg_desc_tbl_off;
@@ -505,12 +503,17 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h, int wait_
                expiry = round_jiffies_up(jiffies + h->transition_tmo * HZ);
 
  retry:
-       err = submit_rtpg(sdev, h, rtpg_ext_hdr_req);
-
-       if (err == SCSI_DH_IO) {
+       retval = submit_rtpg(sdev, h, rtpg_ext_hdr_req);
+       if (retval) {
                if (!scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE,
-                                         &sense_hdr))
+                                         &sense_hdr)) {
+                       sdev_printk(KERN_INFO, sdev,
+                                   "%s: rtpg failed, result %d\n",
+                                   ALUA_DH_NAME, retval);
+                       if (driver_byte(retval) == DRIVER_BUSY)
+                               return SCSI_DH_DEV_TEMP_BUSY;
                        return SCSI_DH_IO;
+               }
 
                /*
                 * submit_rtpg() has failed on existing arrays
@@ -539,8 +542,6 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h, int wait_
                scsi_print_sense_hdr(sdev, ALUA_DH_NAME, &sense_hdr);
                return SCSI_DH_IO;
        }
-       if (err != SCSI_DH_OK)
-               return err;
 
        len = (h->buff[0] << 24) + (h->buff[1] << 16) +
                (h->buff[2] << 8) + h->buff[3] + 4;