scsi: lpfc: Cancel queued work for an IO when processing a received ABTS
authorJames Smart <jsmart2021@gmail.com>
Wed, 22 May 2019 00:49:00 +0000 (17:49 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 18 Jun 2019 23:46:21 +0000 (19:46 -0400)
When queued work is executed posting a new command to the transport
the driver is reporting a null buffer.

The driver had received an ABTS which matched a command that had
been scheduled for delivery to the transport. The driver proceeded
to cancel the command, but the work item was never cancelled.

Fix by cancelling the queued work item. Also turns out the ABTS
response was not properly sending a BA_ACC, so set the flag to
send the ACC.

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_nvmet.c

index 08c2c4e3515b706d7a418a73866933eb30a35e40..36e8d842d9734e7d60267f281f596df4c57952bb 100644 (file)
@@ -1766,6 +1766,7 @@ lpfc_nvmet_rcv_unsol_abort(struct lpfc_vport *vport,
                        nvmet_fc_rcv_fcp_abort(phba->targetport,
                                               &ctxp->ctx.fcp_req);
                } else {
+                       cancel_work_sync(&ctxp->ctxbuf->defer_work);
                        spin_lock_irqsave(&ctxp->ctxlock, iflag);
                        lpfc_nvmet_defer_release(phba, ctxp);
                        spin_unlock_irqrestore(&ctxp->ctxlock, iflag);
@@ -1777,7 +1778,7 @@ lpfc_nvmet_rcv_unsol_abort(struct lpfc_vport *vport,
                        lpfc_nvmet_sol_fcp_issue_abort(phba, ctxp, ctxp->sid,
                                                       ctxp->oxid);
 
-               lpfc_sli4_seq_abort_rsp(vport, fc_hdr, 0);
+               lpfc_sli4_seq_abort_rsp(vport, fc_hdr, 1);
                return 0;
        }