scsi: lpfc: Fix driver crash in target reset handler
authorJames Smart <jsmart2021@gmail.com>
Tue, 12 Mar 2019 23:30:17 +0000 (16:30 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 19 Mar 2019 17:15:08 +0000 (13:15 -0400)
It's possible for the scsi error handler to fire and call the target reset
handler simultaneously to the driver logging out and relogging into the
system.  If hit just right, the re-login may not have fully re-established
the remote port and the rdata->pnod structure may be null.

Check for NULL in the reset handler and return failure if NULL.

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>
drivers/scsi/lpfc/lpfc_scsi.c

index f787d6894dafb3ead590f74a43a08253c4cca39d..2cfb052d35d800e18b18ecd0c8eef3d25b218ec7 100644 (file)
@@ -5049,7 +5049,7 @@ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
        rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
        if (!rdata || !rdata->pnode) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
-                                "0798 Device Reset rport failure: rdata x%p\n",
+                                "0798 Device Reset rdata failure: rdata x%p\n",
                                 rdata);
                return FAILED;
        }
@@ -5118,9 +5118,10 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
        int status;
 
        rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
-       if (!rdata) {
+       if (!rdata || !rdata->pnode) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
-                       "0799 Target Reset rport failure: rdata x%p\n", rdata);
+                                "0799 Target Reset rdata failure: rdata x%p\n",
+                                rdata);
                return FAILED;
        }
        pnode = rdata->pnode;