Thread (17 messages) 17 messages, 2 authors, 2021-01-05

Re: [PATCH 4/8] pm80xx: fix missing tag_free in NVMD DATA req

From: Jinpu Wang <jinpu.wang@cloud.ionos.com>
Date: 2021-01-05 13:25:12

On Wed, Dec 30, 2020 at 5:47 AM Viswas G [off-list ref] wrote:
From: akshatzen <redacted>

Tag is not free'd in NVMD get/set data request failure scenario,
which would have caused tag leak each time the request fails.

Signed-off-by: akshatzen <redacted>
Signed-off-by: Viswas G <redacted>
Signed-off-by: Ruksar Devadi <redacted>
Signed-off-by: Radha Ramachandran <redacted>
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Thx
quoted hunk ↗ jump to hunk
---
 drivers/scsi/pm8001/pm8001_hwi.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index f147193d67bd..9cd6a654f8b2 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -3038,8 +3038,8 @@ void pm8001_mpi_set_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
        complete(pm8001_ha->nvmd_completion);
        pm8001_dbg(pm8001_ha, MSG, "Set nvm data complete!\n");
        if ((dlen_status & NVMD_STAT) != 0) {
-               pm8001_dbg(pm8001_ha, FAIL, "Set nvm data error!\n");
-               return;
+               pm8001_dbg(pm8001_ha, FAIL, "Set nvm data error %x\n",
+                               dlen_status);
        }
        ccb->task = NULL;
        ccb->ccb_tag = 0xFFFFFFFF;
@@ -3062,11 +3062,17 @@ pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)

        pm8001_dbg(pm8001_ha, MSG, "Get nvm data complete!\n");
        if ((dlen_status & NVMD_STAT) != 0) {
-               pm8001_dbg(pm8001_ha, FAIL, "Get nvm data error!\n");
+               pm8001_dbg(pm8001_ha, FAIL, "Get nvm data error %x\n",
+                               dlen_status);
                complete(pm8001_ha->nvmd_completion);
+               /* We should free tag during failure also, the tag is not being
+                * free'd by requesting path anywhere.
+                */
+               ccb->task = NULL;
+               ccb->ccb_tag = 0xFFFFFFFF;
+               pm8001_tag_free(pm8001_ha, tag);
                return;
        }
-
        if (ir_tds_bn_dps_das_nvm & IPMode) {
                /* indirect mode - IR bit set */
                pm8001_dbg(pm8001_ha, MSG, "Get NVMD success, IR=1\n");
--
2.16.3
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help