Skip to content

Commit

Permalink
CIFS: Separate pushing posix locks and lock_sem handling
Browse files Browse the repository at this point in the history
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <smfrench@gmail.com>
  • Loading branch information
Pavel Shilovsky authored and Steve French committed Dec 5, 2012
1 parent 6d3ea7e commit 9ec3c88
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions fs/cifs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,9 +1041,8 @@ struct lock_to_push {
};

static int
cifs_push_posix_locks(struct cifsFileInfo *cfile)
cifs_push_posix_locks_locked(struct cifsFileInfo *cfile)
{
struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
struct file_lock *flock, **before;
unsigned int count = 0, i = 0;
Expand All @@ -1054,14 +1053,6 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)

xid = get_xid();

/* 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;
}

lock_flocks();
cifs_for_each_lock(cfile->dentry->d_inode, before) {
if ((*before)->fl_flags & FL_POSIX)
Expand Down Expand Up @@ -1127,9 +1118,6 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
}

out:
cinode->can_cache_brlcks = false;
up_write(&cinode->lock_sem);

free_xid(xid);
return rc;
err_out:
Expand All @@ -1140,6 +1128,24 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
goto out;
}

static int
cifs_push_posix_locks(struct cifsFileInfo *cfile)
{
struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
int rc = 0;

/* 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);
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)
{
Expand Down

0 comments on commit 9ec3c88

Please sign in to comment.