scsi: lpfc: Fix less-than-zero comparison of unsigned value
authorDick Kennedy <dick.kennedy@broadcom.com>
Mon, 6 Jul 2020 20:42:46 +0000 (13:42 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 8 Jul 2020 05:28:49 +0000 (01:28 -0400)
The expression start_idx - dbg_cnt is evaluated using unsigned int
arthithmetic (since these variables are unsigned ints) and hence can never
be less than zero, so the less than comparison is never true.  Rewrite the
expression to check for start_idx being less than dbg_cnt.

After the logic was corrected, temp_idx wasn't working correctly. So fix it
as well.

Link: https://lore.kernel.org/r/20200706204246.130416-1-jsmart2021@gmail.com
Fixes: 372c187b8a70 ("scsi: lpfc: Add an internal trace log buffer")
CC: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Addresses-Coverity: ("Unsigned compared against 0")

drivers/scsi/lpfc/lpfc_init.c

index 4ba8202d391b2dd9da8b6f8dcc0a2064da060c47..f3656bdcb58279a2a21e9d284fd28a1d8740f620 100644 (file)
@@ -14161,12 +14161,10 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
                if ((start_idx + dbg_cnt) > (DBG_LOG_SZ - 1)) {
                        temp_idx = (start_idx + dbg_cnt) % DBG_LOG_SZ;
                } else {
-                       if ((start_idx - dbg_cnt) < 0) {
+                       if (start_idx < dbg_cnt)
                                start_idx = DBG_LOG_SZ - (dbg_cnt - start_idx);
-                               temp_idx = 0;
-                       } else {
+                       else
                                start_idx -= dbg_cnt;
-                       }
                }
        }
        dev_info(&phba->pcidev->dev, "start %d end %d cnt %d\n",
@@ -14174,7 +14172,7 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
 
        for (i = 0; i < dbg_cnt; i++) {
                if ((start_idx + i) < DBG_LOG_SZ)
-                       temp_idx = (start_idx + i) % (DBG_LOG_SZ - 1);
+                       temp_idx = (start_idx + i) % DBG_LOG_SZ;
                else
                        temp_idx = j++;
                rem_nsec = do_div(phba->dbg_log[temp_idx].t_ns, NSEC_PER_SEC);