• Pavel Shilovsky's avatar
    CIFS: Fix a possible double locking of mutex during reconnect · 96a988ff
    Pavel Shilovsky authored
    With the current code it is possible to lock a mutex twice when
    a subsequent reconnects are triggered. On the 1st reconnect we
    reconnect sessions and tcons and then persistent file handles.
    If the 2nd reconnect happens during the reconnecting of persistent
    file handles then the following sequence of calls is observed:
    
    cifs_reopen_file -> SMB2_open -> small_smb2_init -> smb2_reconnect
    -> cifs_reopen_persistent_file_handles -> cifs_reopen_file (again!).
    
    So, we are trying to acquire the same cfile->fh_mutex twice which
    is wrong. Fix this by moving reconnecting of persistent handles to
    the delayed work (smb2_reconnect_server) and submitting this work
    every time we reconnect tcon in SMB2 commands handling codepath.
    
    This can also lead to corruption of a temporary file list in
    cifs_reopen_persistent_file_handles() because we can recursively
    call this function twice.
    
    Cc: Stable <stable@vger.kernel.org> # v4.9+
    Signed-off-by: default avatarPavel Shilovsky <pshilov@microsoft.com>
    96a988ff
file.c 101 KB