• James Smart's avatar
    scsi: lpfc: Fix FCP I/O flush functionality for TMF routines · cd8a36a9
    James Smart authored
    A prior patch inadvertently caused lpfc_sli_sum_iocb() to exclude counting
    of outstanding aborted I/Os and ABORT IOCBs.  Thus,
    lpfc_reset_flush_io_context() called from any TMF routine does not properly
    wait to flush all outstanding FCP IOCBs leading to a block layer crash on
    an invalid scsi_cmnd->request pointer.
    
      kernel BUG at ../block/blk-core.c:1489!
      RIP: 0010:blk_requeue_request+0xaf/0xc0
      ...
      Call Trace:
      <IRQ>
      __scsi_queue_insert+0x90/0xe0 [scsi_mod]
      blk_done_softirq+0x7e/0x90
      __do_softirq+0xd2/0x280
      irq_exit+0xd5/0xe0
      do_IRQ+0x4c/0xd0
      common_interrupt+0x87/0x87
      </IRQ>
    
    Fix by separating out the LPFC_IO_FCP, LPFC_IO_ON_TXCMPLQ,
    LPFC_DRIVER_ABORTED, and CMD_ABORT_XRI_CN || CMD_CLOSE_XRI_CN checks into a
    new lpfc_sli_validate_fcp_iocb_for_abort() routine when determining to
    build an ABORT iocb.
    
    Restore lpfc_reset_flush_io_context() functionality by including counting
    of outstanding aborted IOCBs and ABORT IOCBs in lpfc_sli_sum_iocb().
    
    Link: https://lore.kernel.org/r/20210910233159.115896-9-jsmart2021@gmail.com
    Fixes: e1364711 ("scsi: lpfc: Fix illegal memory access on Abort IOCBs")
    Cc: <stable@vger.kernel.org> # v5.12+
    Co-developed-by: default avatarJustin Tee <justin.tee@broadcom.com>
    Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
    Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    cd8a36a9
lpfc_sli.c 682 KB