|
@@ -948,7 +948,6 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
|
int rc = 0, stored_rc;
|
|
|
struct cifsLockInfo *li, *tmp;
|
|
|
struct cifs_tcon *tcon;
|
|
|
- struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
|
|
|
unsigned int num, max_num, max_buf;
|
|
|
LOCKING_ANDX_RANGE *buf, *cur;
|
|
|
int types[] = {LOCKING_ANDX_LARGE_FILES,
|
|
@@ -958,21 +957,12 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
|
xid = get_xid();
|
|
|
tcon = tlink_tcon(cfile->tlink);
|
|
|
|
|
|
- /* we are going to update can_cache_brlcks here - need a write access */
|
|
|
- down_write(&cinode->lock_sem);
|
|
|
- if (!cinode->can_cache_brlcks) {
|
|
|
- up_write(&cinode->lock_sem);
|
|
|
- free_xid(xid);
|
|
|
- return rc;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Accessing maxBuf is racy with cifs_reconnect - need to store value
|
|
|
* and check it for zero before using.
|
|
|
*/
|
|
|
max_buf = tcon->ses->server->maxBuf;
|
|
|
if (!max_buf) {
|
|
|
- up_write(&cinode->lock_sem);
|
|
|
free_xid(xid);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -981,7 +971,6 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
|
sizeof(LOCKING_ANDX_RANGE);
|
|
|
buf = kzalloc(max_num * sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
|
|
|
if (!buf) {
|
|
|
- up_write(&cinode->lock_sem);
|
|
|
free_xid(xid);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
@@ -1018,9 +1007,6 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- cinode->can_cache_brlcks = false;
|
|
|
- up_write(&cinode->lock_sem);
|
|
|
-
|
|
|
kfree(buf);
|
|
|
free_xid(xid);
|
|
|
return rc;
|
|
@@ -1041,7 +1027,7 @@ struct lock_to_push {
|
|
|
};
|
|
|
|
|
|
static int
|
|
|
-cifs_push_posix_locks_locked(struct cifsFileInfo *cfile)
|
|
|
+cifs_push_posix_locks(struct cifsFileInfo *cfile)
|
|
|
{
|
|
|
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
|
|
struct file_lock *flock, **before;
|
|
@@ -1129,9 +1115,11 @@ err_out:
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-cifs_push_posix_locks(struct cifsFileInfo *cfile)
|
|
|
+cifs_push_locks(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;
|
|
|
|
|
|
/* we are going to update can_cache_brlcks here - need a write access */
|
|
@@ -1140,24 +1128,17 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
|
|
|
up_write(&cinode->lock_sem);
|
|
|
return rc;
|
|
|
}
|
|
|
- rc = cifs_push_posix_locks_locked(cfile);
|
|
|
- cinode->can_cache_brlcks = false;
|
|
|
- up_write(&cinode->lock_sem);
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
-static int
|
|
|
-cifs_push_locks(struct cifsFileInfo *cfile)
|
|
|
-{
|
|
|
- struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
|
|
|
- struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
|
|
|
|
|
if (cap_unix(tcon->ses) &&
|
|
|
(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
|
|
|
((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
|
|
|
- return cifs_push_posix_locks(cfile);
|
|
|
+ rc = cifs_push_posix_locks(cfile);
|
|
|
+ else
|
|
|
+ rc = tcon->ses->server->ops->push_mand_locks(cfile);
|
|
|
|
|
|
- return tcon->ses->server->ops->push_mand_locks(cfile);
|
|
|
+ cinode->can_cache_brlcks = false;
|
|
|
+ up_write(&cinode->lock_sem);
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
static void
|