• Paulo Alcantara's avatar
    cifs: fix potential deadlock in cache_refresh_path() · 9fb0db40
    Paulo Alcantara authored
    Avoid getting DFS referral from an exclusive lock in
    cache_refresh_path() because the tcon IPC used for getting the
    referral could be disconnected and thus causing a deadlock as shown
    below:
    
    task A                       task B
    ======                       ======
    cifs_demultiplex_thread()    dfs_cache_find()
     cifs_handle_standard()       cache_refresh_path()
      reconnect_dfs_server()       down_write()
       dfs_cache_noreq_find()       get_dfs_referral()
        down_read() <- deadlock      smb2_get_dfs_refer()
                                      SMB2_ioctl()
    				   cifs_send_recv()
    				    compound_send_recv()
    				     wait_for_response()
    
    where task A cannot wake up task B because it is blocked on
    down_read() due to the exclusive lock held in cache_refresh_path() and
    therefore not being able to make progress.
    
    Fixes: c9f71103
    
     ("cifs: keep referral server sessions alive")
    Reviewed-by: default avatarAurélien Aptel <aurelien.aptel@gmail.com>
    Signed-off-by: default avatarPaulo Alcantara (SUSE) <pc@cjr.nz>
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    9fb0db40
dfs_cache.c 35.6 KB