]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Do not reset adapter if SRB handle is in range.
authorChad Dupuis <chad.dupuis@qlogic.com>
Tue, 6 Oct 2015 09:06:34 +0000 (14:36 +0530)
committerDan Duval <dan.duval@oracle.com>
Thu, 15 Oct 2015 22:01:30 +0000 (18:01 -0400)
Orabug: 21946579

If an SRB is NULL but the handle is in range just drop the
command instead of also resetting the adapter. If the handle
is in range then the command was valid at some point and may
have been aborted. Resetting the adapter can lead to extended
recovery times in this case.

Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
Signed-off-by: Dan Duval <dan.duval@oracle.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

index b61311d1ea882c0773d72d862eaaeca92b5c238a..8d326fde009bbe4ce0a1318d38b48771d590803b 100644 (file)
@@ -19,7 +19,7 @@
  * | Device Discovery             |       0x2016       | 0x2020-0x2022, |
  * |                              |                    | 0x2011-0x2012, |
  * |                              |                    | 0x2099-0x20a4  |
- * | Queue Command and IO tracing |       0x3059       | 0x300b         |
+ * | Queue Command and IO tracing |       0x3075       | 0x300b         |
  * |                              |                    | 0x3027-0x3028  |
  * |                              |                    | 0x303d-0x3041  |
  * |                              |                    | 0x302d,0x3033  |
index b1b17555387430b518b92bc281a8dde3d7abed27..ea15ad8a926ec9b6c3769de071fc89aac0785f8b 100644 (file)
@@ -2073,14 +2073,18 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
        }
 
        /* Validate handle. */
-       if (handle < req->num_outstanding_cmds)
+       if (handle < req->num_outstanding_cmds) {
                sp = req->outstanding_cmds[handle];
-       else
-               sp = NULL;
-
-       if (sp == NULL) {
+               if (!sp) {
+                       ql_dbg(ql_dbg_io, vha, 0x3075,
+                           "%s(%ld): Already returned command for status handle (0x%x).\n",
+                           __func__, vha->host_no, sts->handle);
+                       return;
+               }
+       } else {
                ql_dbg(ql_dbg_io, vha, 0x3017,
-                   "Invalid status handle (0x%x).\n", sts->handle);
+                   "Invalid status handle, out of range (0x%x).\n",
+                   sts->handle);
 
                if (!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
                        if (IS_P3P_TYPE(ha))
@@ -2367,12 +2371,12 @@ out:
                ql_dbg(ql_dbg_io, fcport->vha, 0x3022,
                    "FCP command status: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu "
                    "portid=%02x%02x%02x oxid=0x%x cdb=%10phN len=0x%x "
-                   "rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n",
+                   "rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n",
                    comp_status, scsi_status, res, vha->host_no,
                    cp->device->id, cp->device->lun, fcport->d_id.b.domain,
                    fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id,
                    cp->cmnd, scsi_bufflen(cp), rsp_info_len,
-                   resid_len, fw_resid_len);
+                   resid_len, fw_resid_len, sp, cp);
 
        if (rsp->status_srb == NULL)
                sp->done(ha, sp, res);
index 90bd222486336e46bf015fad640981d69c73a2ed..87ea1acc3dd1c07d0b3f6ff830c0140a62f38f2d 100644 (file)
@@ -958,8 +958,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        }
 
        ql_dbg(ql_dbg_taskm, vha, 0x8002,
-           "Aborting from RISC nexus=%ld:%d:%llu sp=%p cmd=%p\n",
-           vha->host_no, id, lun, sp, cmd);
+           "Aborting from RISC nexus=%ld:%d:%llu sp=%p cmd=%p handle=%x\n",
+           vha->host_no, id, lun, sp, cmd, sp->handle);
 
        /* Get a reference to the sp and drop the lock.*/
        sp_get(sp);