Re: [PATCH] qla2xxx: Fix memory leak for allocating abort IOCB

2018-07-30 Thread Martin K. Petersen


Himanshu,

> In the case of IOCB QFull, Initiator code can leave behind a stale
> pointer to an SRB structure on the outstanding command array.

Applied to 4.18/scsi-fixes. Thanks!

-- 
Martin K. Petersen  Oracle Linux Engineering


[PATCH] qla2xxx: Fix memory leak for allocating abort IOCB

2018-07-26 Thread Himanshu Madhani
From: Quinn Tran 

In the case of IOCB QFull, Initiator code can leave behind
a stale pointer to an SRB structure on the outstanding command
array.

Fixes: 82de802ad46e ("scsi: qla2xxx: Preparation for Target MQ.")
Cc: sta...@vger.kernel.org #4.16
Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
Hi Martin, 

This patch fixes memory leak detected in the automation framework which 
triggers lots
of error condition.

Please apply this patch to 4.18/scsi-fixes at your earliest convenience.

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_iocb.c | 53 +
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index a91cca52b5d5..dd93a22fe843 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2130,34 +2130,11 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t 
*sp)
req_cnt = 1;
handle = 0;
 
-   if (!sp)
-   goto skip_cmd_array;
-
-   /* Check for room in outstanding command list. */
-   handle = req->current_outstanding_cmd;
-   for (index = 1; index < req->num_outstanding_cmds; index++) {
-   handle++;
-   if (handle == req->num_outstanding_cmds)
-   handle = 1;
-   if (!req->outstanding_cmds[handle])
-   break;
-   }
-   if (index == req->num_outstanding_cmds) {
-   ql_log(ql_log_warn, vha, 0x700b,
-   "No room on outstanding cmd array.\n");
-   goto queuing_error;
-   }
-
-   /* Prep command array. */
-   req->current_outstanding_cmd = handle;
-   req->outstanding_cmds[handle] = sp;
-   sp->handle = handle;
-
-   /* Adjust entry-counts as needed. */
-   if (sp->type != SRB_SCSI_CMD)
+   if (sp && (sp->type != SRB_SCSI_CMD)) {
+   /* Adjust entry-counts as needed. */
req_cnt = sp->iocbs;
+   }
 
-skip_cmd_array:
/* Check for room on request queue. */
if (req->cnt < req_cnt + 2) {
if (qpair->use_shadow_reg)
@@ -2183,6 +2160,28 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
if (req->cnt < req_cnt + 2)
goto queuing_error;
 
+   if (sp) {
+   /* Check for room in outstanding command list. */
+   handle = req->current_outstanding_cmd;
+   for (index = 1; index < req->num_outstanding_cmds; index++) {
+   handle++;
+   if (handle == req->num_outstanding_cmds)
+   handle = 1;
+   if (!req->outstanding_cmds[handle])
+   break;
+   }
+   if (index == req->num_outstanding_cmds) {
+   ql_log(ql_log_warn, vha, 0x700b,
+   "No room on outstanding cmd array.\n");
+   goto queuing_error;
+   }
+
+   /* Prep command array. */
+   req->current_outstanding_cmd = handle;
+   req->outstanding_cmds[handle] = sp;
+   sp->handle = handle;
+   }
+
/* Prep packet */
req->cnt -= req_cnt;
pkt = req->ring_ptr;
@@ -2195,6 +2194,8 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
pkt->handle = handle;
}
 
+   return pkt;
+
 queuing_error:
qpair->tgt_counters.num_alloc_iocb_failed++;
return pkt;
-- 
2.12.0