• Javed Hasan's avatar
    scsi: libfc: Avoid invoking response handler twice if ep is already completed · b2b0f16f
    Javed Hasan authored
    A race condition exists between the response handler getting called because
    of exchange_mgr_reset() (which clears out all the active XIDs) and the
    response we get via an interrupt.
    
    Sequence of events:
    
    	 rport ba0200: Port timeout, state PLOGI
    	 rport ba0200: Port entered PLOGI state from PLOGI state
    	 xid 1052: Exchange timer armed : 20000 msecs      xid timer armed here
    	 rport ba0200: Received LOGO request while in state PLOGI
    	 rport ba0200: Delete port
    	 rport ba0200: work event 3
    	 rport ba0200: lld callback ev 3
    	 bnx2fc: rport_event_hdlr: event = 3, port_id = 0xba0200
    	 bnx2fc: ba0200 - rport not created Yet!!
    	 /* Here we reset any outstanding exchanges before
    	 freeing rport using the exch_mgr_reset() */
    	 xid 1052: Exchange timer canceled
    	 /* Here we got two responses for one xid */
    	 xid 1052: invoking resp(), esb 20000000 state 3
    	 xid 1052: invoking resp(), esb 20000000 state 3
    	 xid 1052: fc_rport_plogi_resp() : ep->resp_active 2
    	 xid 1052: fc_rport_plogi_resp() : ep->resp_active 2
    
    Skip the response if the exchange is already completed.
    
    Link: https://lore.kernel.org/r/20201215194731.2326-1-jhasan@marvell.comSigned-off-by: default avatarJaved Hasan <jhasan@marvell.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    b2b0f16f
fc_exch.c 70.9 KB