Commit 689c3db4 authored by Pavel Shilovsky's avatar Pavel Shilovsky Committed by Steve French

CIFS: Fix a deadlock when a file is reopened

If we request reading or writing on a file that needs to be
reopened, it causes the deadlock: we are already holding rw
semaphore for reading and then we try to acquire it for writing
in cifs_relock_file. Fix this by acquiring the semaphore for
reading in cifs_relock_file due to we don't make any changes in
locks and don't need a write access.

CC: <stable@vger.kernel.org>
Signed-off-by: default avatarPavel Shilovsky <pshilovsky@samba.org>
Acked-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent b33fcf1c
...@@ -561,11 +561,10 @@ cifs_relock_file(struct cifsFileInfo *cfile) ...@@ -561,11 +561,10 @@ cifs_relock_file(struct cifsFileInfo *cfile)
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
int rc = 0; int rc = 0;
/* we are going to update can_cache_brlcks here - need a write access */ down_read(&cinode->lock_sem);
down_write(&cinode->lock_sem);
if (cinode->can_cache_brlcks) { if (cinode->can_cache_brlcks) {
/* can cache locks - no need to push them */ /* can cache locks - no need to relock */
up_write(&cinode->lock_sem); up_read(&cinode->lock_sem);
return rc; return rc;
} }
...@@ -576,7 +575,7 @@ cifs_relock_file(struct cifsFileInfo *cfile) ...@@ -576,7 +575,7 @@ cifs_relock_file(struct cifsFileInfo *cfile)
else else
rc = tcon->ses->server->ops->push_mand_locks(cfile); rc = tcon->ses->server->ops->push_mand_locks(cfile);
up_write(&cinode->lock_sem); up_read(&cinode->lock_sem);
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment