diff options
author | Pavel Shilovsky <piastry@etersoft.ru> | 2012-11-22 08:00:10 -0500 |
---|---|---|
committer | Steve French <smfrench@gmail.com> | 2012-12-05 14:27:29 -0500 |
commit | 9ec3c882879d3777914d34c0143c7d5b87dbb5ea (patch) | |
tree | 97a8b4e85e85021152a2d9fcd5310b5ac23c2842 /fs/cifs | |
parent | 6d3ea7e4975aed451fbee4dea2fef63b0de8cb4f (diff) |
CIFS: Separate pushing posix locks and lock_sem handling
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/file.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 70b6f4c3a0c1..5fbbf99e61f9 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -1041,9 +1041,8 @@ struct lock_to_push { | |||
1041 | }; | 1041 | }; |
1042 | 1042 | ||
1043 | static int | 1043 | static int |
1044 | cifs_push_posix_locks(struct cifsFileInfo *cfile) | 1044 | cifs_push_posix_locks_locked(struct cifsFileInfo *cfile) |
1045 | { | 1045 | { |
1046 | struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); | ||
1047 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | 1046 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); |
1048 | struct file_lock *flock, **before; | 1047 | struct file_lock *flock, **before; |
1049 | unsigned int count = 0, i = 0; | 1048 | unsigned int count = 0, i = 0; |
@@ -1054,14 +1053,6 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | |||
1054 | 1053 | ||
1055 | xid = get_xid(); | 1054 | xid = get_xid(); |
1056 | 1055 | ||
1057 | /* we are going to update can_cache_brlcks here - need a write access */ | ||
1058 | down_write(&cinode->lock_sem); | ||
1059 | if (!cinode->can_cache_brlcks) { | ||
1060 | up_write(&cinode->lock_sem); | ||
1061 | free_xid(xid); | ||
1062 | return rc; | ||
1063 | } | ||
1064 | |||
1065 | lock_flocks(); | 1056 | lock_flocks(); |
1066 | cifs_for_each_lock(cfile->dentry->d_inode, before) { | 1057 | cifs_for_each_lock(cfile->dentry->d_inode, before) { |
1067 | if ((*before)->fl_flags & FL_POSIX) | 1058 | if ((*before)->fl_flags & FL_POSIX) |
@@ -1127,9 +1118,6 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | |||
1127 | } | 1118 | } |
1128 | 1119 | ||
1129 | out: | 1120 | out: |
1130 | cinode->can_cache_brlcks = false; | ||
1131 | up_write(&cinode->lock_sem); | ||
1132 | |||
1133 | free_xid(xid); | 1121 | free_xid(xid); |
1134 | return rc; | 1122 | return rc; |
1135 | err_out: | 1123 | err_out: |
@@ -1141,6 +1129,24 @@ err_out: | |||
1141 | } | 1129 | } |
1142 | 1130 | ||
1143 | static int | 1131 | static int |
1132 | cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
1133 | { | ||
1134 | struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); | ||
1135 | int rc = 0; | ||
1136 | |||
1137 | /* we are going to update can_cache_brlcks here - need a write access */ | ||
1138 | down_write(&cinode->lock_sem); | ||
1139 | if (!cinode->can_cache_brlcks) { | ||
1140 | up_write(&cinode->lock_sem); | ||
1141 | return rc; | ||
1142 | } | ||
1143 | rc = cifs_push_posix_locks_locked(cfile); | ||
1144 | cinode->can_cache_brlcks = false; | ||
1145 | up_write(&cinode->lock_sem); | ||
1146 | return rc; | ||
1147 | } | ||
1148 | |||
1149 | static int | ||
1144 | cifs_push_locks(struct cifsFileInfo *cfile) | 1150 | cifs_push_locks(struct cifsFileInfo *cfile) |
1145 | { | 1151 | { |
1146 | struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb); | 1152 | struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb); |