diff options
author | Paulo Alcantara <pc@cjr.nz> | 2023-01-17 19:00:37 -0300 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2023-01-18 10:45:40 -0600 |
commit | 9fb0db40513e27537fde63287aea920b60557a69 (patch) | |
tree | e76129a7dcf2b7f5ecd5515557e9dfd2d6a2cb7a /security | |
parent | 5dc4c995db9eb45f6373a956eb1f69460e69e6d4 (diff) |
cifs: fix potential deadlock in cache_refresh_path()
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: c9f711039905 ("cifs: keep referral server sessions alive")
Reviewed-by: Aurélien Aptel <aurelien.aptel@gmail.com>
Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'security')
0 files changed, 0 insertions, 0 deletions