• Tyrel Datwyler's avatar
    scsi: ibmvscsi: Fix potential race after loss of transport · 665e0224
    Tyrel Datwyler authored
    After a loss of transport due to an adapter migration or crash/disconnect
    from the host partner there is a tiny window where we can race adjusting
    the request_limit of the adapter. The request limit is atomically
    increased/decreased to track the number of inflight requests against the
    allowed limit of our VIOS partner.
    
    After a transport loss we set the request_limit to zero to reflect this
    state.  However, there is a window where the adapter may attempt to queue a
    command because the transport loss event hasn't been fully processed yet
    and request_limit is still greater than zero.  The hypercall to send the
    event will fail and the error path will increment the request_limit as a
    result.  If the adapter processes the transport event prior to this
    increment the request_limit becomes out of sync with the adapter state and
    can result in SCSI commands being submitted on the now reset connection
    prior to an SRP Login resulting in a protocol violation.
    
    Fix this race by protecting request_limit with the host lock when changing
    the value via atomic_set() to indicate no transport.
    
    Link: https://lore.kernel.org/r/20201025001355.4527-1-tyreld@linux.ibm.comSigned-off-by: default avatarTyrel Datwyler <tyreld@linux.ibm.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    665e0224
ibmvscsi.c 69.7 KB