• Alexei Potashnik's avatar
    qla2xxx: Delete session if initiator is gone from FW · 71cdc079
    Alexei Potashnik authored
    1. Initiator A is logged in with fc_id(1)/loop_id(1)
    2. Initiator A re-logs in with fc_id(2)/loop_id(2)
    3. Part of old session deletion async logoout for 1/1 is queued
    4. Initiator B logs in with fc_id(1)/loop_id(1), starts
       passing data and creates session.
    5. Async logo from 3 is processed by DPC and sent to FW
    
    Now initiator B has the session but is logged out from FW.
    
    This condition is detected first with CTIO error 29 at which
    point we should delete current session. During session
    deletion we will send LOGO to initiator to force re-login.
    
    Under rare circumstances initiator might be logged out of FW,
    not have driver session, but still think it's logged in.
    E.g. the above sequence plus session deletion due to re-config.
    Incoming commands will fail to create local session because
    initiator is not found in FW. In this case we also issue LOGO
    to initiator to force him re-login.
    
    Finally this patch fixes exchange leak when commands where
    received in logged out state. In this case loop_id must be
    set to FFFF when corresponding exchange is terminated. The
    patch modifies exchange termination to always use FFFF,
    since in certain scenarios it's impossible to tell whether
    command was received in logged in or logged out state.
    Signed-off-by: default avatarAlexei Potashnik <alexei@purestorage.com>
    Acked-by: default avatarQuinn Tran <quinn.tran@qlogic.com>
    Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    71cdc079
qla_os.c 163 KB