From 0b53f79152c929629fe387f6ff19d5bf5cc73872 Mon Sep 17 00:00:00 2001 From: Pavel Shilovsky Date: Thu, 22 Nov 2012 17:10:57 +0400 Subject: [PATCH] --- yaml --- r: 339465 b: refs/heads/master c: f152fd5fffa78910c467b17f12d0aa060aa408a6 h: refs/heads/master i: 339463: b13c7fbb3ab712a9fb78c613ef34ed69b88e00ca v: v3 --- [refs] | 2 +- trunk/fs/cifs/file.c | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 3e235a302890..b97d6d6897a7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b8db928b765b4b0fe1aec3eb7f1741fedbed9a33 +refs/heads/master: f152fd5fffa78910c467b17f12d0aa060aa408a6 diff --git a/trunk/fs/cifs/file.c b/trunk/fs/cifs/file.c index 1747cbff7ddf..67fe0b811f23 100644 --- a/trunk/fs/cifs/file.c +++ b/trunk/fs/cifs/file.c @@ -505,16 +505,36 @@ int cifs_open(struct inode *inode, struct file *file) return rc; } +static int cifs_push_posix_locks(struct cifsFileInfo *cfile); + /* * Try to reacquire byte range locks that were released when session - * to server was lost + * to server was lost. */ -static int cifs_relock_file(struct cifsFileInfo *cifsFile) +static int +cifs_relock_file(struct cifsFileInfo *cfile) { + struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb); + struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); + struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); int rc = 0; - /* BB list all locks open on this file and relock */ + /* we are going to update can_cache_brlcks here - need a write access */ + down_write(&cinode->lock_sem); + if (cinode->can_cache_brlcks) { + /* can cache locks - no need to push them */ + up_write(&cinode->lock_sem); + return rc; + } + + if (cap_unix(tcon->ses) && + (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && + ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) + rc = cifs_push_posix_locks(cfile); + else + rc = tcon->ses->server->ops->push_mand_locks(cfile); + up_write(&cinode->lock_sem); return rc; }