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: Pavel Shilovsky <pshilovsky@samba.org> Acked-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
b33fcf1c9d
commit
689c3db4d5
1 changed files with 4 additions and 5 deletions
|
@ -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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue