• N
    SUNRPC: avoid race between mod_timer() and del_timer_sync() · 3848e96e
    NeilBrown 提交于
    xprt_destory() claims XPRT_LOCKED and then calls del_timer_sync().
    Both xprt_unlock_connect() and xprt_release() call
     ->release_xprt()
    which drops XPRT_LOCKED and *then* xprt_schedule_autodisconnect()
    which calls mod_timer().
    
    This may result in mod_timer() being called *after* del_timer_sync().
    When this happens, the timer may fire long after the xprt has been freed,
    and run_timer_softirq() will probably crash.
    
    The pairing of ->release_xprt() and xprt_schedule_autodisconnect() is
    always called under ->transport_lock.  So if we take ->transport_lock to
    call del_timer_sync(), we can be sure that mod_timer() will run first
    (if it runs at all).
    
    Cc: stable@vger.kernel.org
    Signed-off-by: NNeilBrown <neilb@suse.de>
    Signed-off-by: NTrond Myklebust <trond.myklebust@hammerspace.com>
    3848e96e
xprt.c 53.7 KB