qla2xxx: Do not reset adapter if SRB handle is in range.
authorChad Dupuis <chad.dupuis@qlogic.com>
Tue, 4 Aug 2015 17:37:57 +0000 (13:37 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Thu, 27 Aug 2015 00:45:27 +0000 (17:45 -0700)
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>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

index 05d8cf0165433058020684eed64aeb310b105f9a..c6e51c6cd3dca4cf1a813d3db476875964af4ca3 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 b2b93dfbffd36fc8d089439b488a2c28daff68ab..08190e07c6405d521f4edab45df134a065b1046d 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 8763c12cb6c2713cf3b45bc037d3186b68bfe5b6..f70809feca90a6f3c17967761e482feb340cc256 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);