• Karsten Graul's avatar
    net/smc: fix 'workqueue leaked lock' in smc_conn_abort_work · a18cee47
    Karsten Graul authored
    The abort_work is scheduled when a connection was detected to be
    out-of-sync after a link failure. The work calls smc_conn_kill(),
    which calls smc_close_active_abort() and that might end up calling
    smc_close_cancel_work().
    smc_close_cancel_work() cancels any pending close_work and tx_work but
    needs to release the sock_lock before and acquires the sock_lock again
    afterwards. So when the sock_lock was NOT acquired before then it may
    be held after the abort_work completes. Thats why the sock_lock is
    acquired before the call to smc_conn_kill() in __smc_lgr_terminate(),
    but this is missing in smc_conn_abort_work().
    
    Fix that by acquiring the sock_lock first and release it after the
    call to smc_conn_kill().
    
    Fixes: b286a065 ("net/smc: handle incoming CDC validation message")
    Signed-off-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a18cee47
smc_core.c 61.2 KB