Re: [PATCH 04/18] qla2xxx: Proper cleanup of pass through commands when firmware returns error.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On Wed, 14 Dec 2011, James Bottomley wrote:

On Fri, 2011-11-18 at 09:03 -0800, Chad Dupuis wrote:
From: Giridhar Malavali <giridhar.malavali@xxxxxxxxxx>

Signed-off-by: Giridhar Malavali <giridhar.malavali@xxxxxxxxxx>
Signed-off-by: Chad Dupuis <chad.dupuis@xxxxxxxxxx>
---
 drivers/scsi/qla2xxx/qla_isr.c |   73 ++++++++++++++++++++++++++++-----------
 drivers/scsi/qla2xxx/qla_os.c  |   19 +++++-----
 2 files changed, 61 insertions(+), 31 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index b6023e9..c5d6cd1 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -1895,6 +1895,45 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
     }
 }

+static int
+qla2x00_free_sp_ctx(scsi_qla_host_t *vha, srb_t *sp)
+{
+    struct qla_hw_data *ha = vha->hw;
+    struct srb_ctx *ctx;
+
+    if (!sp->ctx)
+            return 1;
+
+    ctx = sp->ctx;
+
+    if (ctx->type == SRB_LOGIN_CMD ||
+        ctx->type == SRB_LOGOUT_CMD ||
+        ctx->type == SRB_TM_CMD) {
+            ((struct srb_iocb*)ctx->u.iocb_cmd)->done(sp);

This cast is completely pointless: u.iocb_cmd is already a struct
sr_iocb * (and yes, you do need the space).

Yes, this makes sense. Thanks.


+            return 0;
+    } else if (ctx->type == SRB_ADISC_CMD) {
+            ((struct srb_iocb*)ctx->u.iocb_cmd)->free(sp);

And here.

+            return 0;
+    } else {
+            struct fc_bsg_job *bsg_job;
+
+            bsg_job = ctx->u.bsg_job;
+            if (ctx->type == SRB_ELS_CMD_HST ||
+                ctx->type == SRB_CT_CMD)
+                    kfree(sp->fcport);
+
+            bsg_job->reply->reply_data.ctels_reply.status =
+                FC_CTELS_STATUS_OK;
+            bsg_job->reply->result = DID_ERROR << 16;
+            bsg_job->reply->reply_payload_rcv_len = 0;
+            kfree(sp->ctx);
+            mempool_free(sp, ha->srb_mempool);
+            bsg_job->job_done(bsg_job);
+            return 0;
+    }
+    return 1;
+}
+
 /**
  * qla2x00_error_entry() - Process an error entry.
  * @ha: SCSI driver HA context
@@ -1905,7 +1944,7 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
 {
     srb_t *sp;
     struct qla_hw_data *ha = vha->hw;
-    uint32_t handle = LSW(pkt->handle);
+    const char func[] = "ERROR-IOCB";
     uint16_t que = MSW(pkt->handle);
     struct req_que *req = ha->req_q_map[que];

@@ -1928,28 +1967,20 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
             ql_dbg(ql_dbg_async, vha, 0x502f,
                 "UNKNOWN flag error.\n");

-    /* Validate handle. */
-    if (handle < MAX_OUTSTANDING_COMMANDS)
-            sp = req->outstanding_cmds[handle];
-    else
-            sp = NULL;
-
+    sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
     if (sp) {
-            /* Free outstanding command slot. */
-            req->outstanding_cmds[handle] = NULL;
-
-            /* Bad payload or header */
-            if (pkt->entry_status &
-                (RF_INV_E_ORDER | RF_INV_E_COUNT |
-                 RF_INV_E_PARAM | RF_INV_E_TYPE)) {
-                    sp->cmd->result = DID_ERROR << 16;
-            } else if (pkt->entry_status & RF_BUSY) {
-                    sp->cmd->result = DID_BUS_BUSY << 16;
-            } else {
-                    sp->cmd->result = DID_ERROR << 16;
+            if (qla2x00_free_sp_ctx (vha, sp)) {

And there's an extra space here (checkpatch warns about this, so I
assume you didn't run it).

James





This message and any attached documents contain information from QLogic Corporation or its wholly-owned subsidiaries that may be confidential. If you are not the intended recipient, you may not read, copy, distribute, or use this information. If you have received this transmission in error, please notify the sender immediately by reply e-mail and then delete this message.

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux