linux_dsm_epyc7002/fs/cifs
Dave Wysochanski d46b0da7a3 cifs: Fix cifsInodeInfo lock_sem deadlock when reconnect occurs
There's a deadlock that is possible and can easily be seen with
a test where multiple readers open/read/close of the same file
and a disruption occurs causing reconnect.  The deadlock is due
a reader thread inside cifs_strict_readv calling down_read and
obtaining lock_sem, and then after reconnect inside
cifs_reopen_file calling down_read a second time.  If in
between the two down_read calls, a down_write comes from
another process, deadlock occurs.

        CPU0                    CPU1
        ----                    ----
cifs_strict_readv()
 down_read(&cifsi->lock_sem);
                               _cifsFileInfo_put
                                  OR
                               cifs_new_fileinfo
                                down_write(&cifsi->lock_sem);
cifs_reopen_file()
 down_read(&cifsi->lock_sem);

Fix the above by changing all down_write(lock_sem) calls to
down_write_trylock(lock_sem)/msleep() loop, which in turn
makes the second down_read call benign since it will never
block behind the writer while holding lock_sem.

Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Suggested-by: Ronnie Sahlberg <lsahlber@redhat.com>
Reviewed--by: Ronnie Sahlberg <lsahlber@redhat.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
2019-10-24 21:35:04 -05:00
..
asn1.c
cache.c
cifs_debug.c smb3: display max smb3 requests in flight at any one time 2019-09-16 11:43:38 -05:00
cifs_debug.h cifs: add a debug macro that prints \\server\share for errors 2019-09-16 11:43:38 -05:00
cifs_dfs_ref.c
cifs_fs_sb.h smb3: add mount option to allow RW caching of share accessed by only 1 client 2019-09-16 11:43:38 -05:00
cifs_ioctl.h smb3: allow decryption keys to be dumped by admin for debugging 2019-09-21 06:02:26 -05:00
cifs_spnego.c
cifs_spnego.h
cifs_unicode.c
cifs_unicode.h
cifs_uniupr.h
cifsacl.c cifs: modefromsid: write mode ACE first 2019-09-16 18:49:11 -05:00
cifsacl.h smb3: missing ACL related flags 2019-09-26 16:37:43 -05:00
cifsencrypt.c
cifsfs.c cifs: clarify comment about timestamp granularity for old servers 2019-10-20 19:19:49 -05:00
cifsfs.h cifs: update internal module version number 2019-09-16 19:18:39 -05:00
cifsglob.h cifs: Fix cifsInodeInfo lock_sem deadlock when reconnect occurs 2019-10-24 21:35:04 -05:00
cifspdu.h
cifsproto.h cifs: Fix cifsInodeInfo lock_sem deadlock when reconnect occurs 2019-10-24 21:35:04 -05:00
cifsroot.c cifs: cifsroot: add more err checking 2019-09-16 11:43:39 -05:00
cifssmb.c smb3: pass mode bits into create calls 2019-09-26 02:06:42 -05:00
connect.c CIFS: Fix retry mid list corruption on reconnects 2019-10-24 21:32:32 -05:00
dfs_cache.c
dfs_cache.h
dir.c CIFS: Force reval dentry if LOOKUP_REVAL flag is set 2019-10-09 00:10:50 -05:00
dns_resolve.c
dns_resolve.h
export.c
file.c cifs: Fix cifsInodeInfo lock_sem deadlock when reconnect occurs 2019-10-24 21:35:04 -05:00
fscache.c
fscache.h
inode.c cifs: Fix missed free operations 2019-10-20 19:19:49 -05:00
ioctl.c smb3: allow decryption keys to be dumped by admin for debugging 2019-09-21 06:02:26 -05:00
Kconfig various cifs/smb3 fixes (including for share deleted cases) and features including improved encrypted read performance, and various debugging improvements 2019-09-19 10:32:16 -07:00
link.c
Makefile cifs: Add support for root file systems 2019-09-16 11:43:38 -05:00
misc.c
netmisc.c fs: cifs: mute -Wunused-const-variable message 2019-10-06 22:04:35 -05:00
nterr.c
nterr.h
ntlmssp.h
readdir.c
rfc1002pdu.h
sess.c fs/cifs/sess.c: Remove set but not used variable 'capabilities' 2019-09-23 22:51:57 -05:00
smb1ops.c CIFS: avoid using MID 0xFFFF 2019-10-20 19:19:49 -05:00
smb2file.c cifs: Fix cifsInodeInfo lock_sem deadlock when reconnect occurs 2019-10-24 21:35:04 -05:00
smb2glob.h
smb2inode.c smb3: pass mode bits into create calls 2019-09-26 02:06:42 -05:00
smb2maperror.c smb3: improve handling of share deleted (and share recreated) 2019-09-16 11:43:38 -05:00
smb2misc.c
smb2ops.c CIFS: Fix oplock handling for SMB 2.1+ protocols 2019-09-26 16:42:44 -05:00
smb2pdu.c smb3: remove noisy debug message and minor cleanup 2019-10-08 18:19:40 -07:00
smb2pdu.h
smb2proto.h smb3: cleanup some recent endian errors spotted by updated sparse 2019-10-06 22:04:29 -05:00
smb2status.h
smb2transport.c smb3: allow skipping signature verification for perf sensitive configurations 2019-09-16 11:43:38 -05:00
smbdirect.c
smbdirect.h
smbencrypt.c
smberr.h
smbfsctl.h smb3: Add missing reparse tags 2019-09-24 23:31:32 -05:00
trace.c
trace.h smb3: add missing worker function for SMB3 change notify 2019-09-16 11:43:39 -05:00
transport.c CIFS: Fix retry mid list corruption on reconnects 2019-10-24 21:32:32 -05:00
winucase.c
xattr.c CIFS: fix max ea value size 2019-09-23 23:28:59 -05:00