aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/file.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2010-10-15 15:34:06 -0400
committerSteve French <sfrench@us.ibm.com>2010-10-24 20:18:59 -0400
commit5f6dbc9e4afe4d1d39e85de3ac2720a2042ad191 (patch)
tree8e97fe18b6d0824981fd377b2ff35042da264bb4 /fs/cifs/file.c
parent229aebb873e29726b91e076161649cf45154b0bf (diff)
cifs: convert cifsFileInfo->count to non-atomic counter
The count for cifsFileInfo is currently an atomic, but that just adds complexity for little value. We generally need to hold cifs_file_list_lock to traverse the lists anyway so we might as well make this counter non-atomic and simply use the cifs_file_list_lock to protect it. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Suresh Jayaraman <sjayaraman@suse.de> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r--fs/cifs/file.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 8c81e7b14d53..baf4b5067ff9 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -232,6 +232,7 @@ cifs_new_fileinfo(__u16 fileHandle, struct file *file,
232 if (pCifsFile == NULL) 232 if (pCifsFile == NULL)
233 return pCifsFile; 233 return pCifsFile;
234 234
235 pCifsFile->count = 1;
235 pCifsFile->netfid = fileHandle; 236 pCifsFile->netfid = fileHandle;
236 pCifsFile->pid = current->tgid; 237 pCifsFile->pid = current->tgid;
237 pCifsFile->uid = current_fsuid(); 238 pCifsFile->uid = current_fsuid();
@@ -242,7 +243,6 @@ cifs_new_fileinfo(__u16 fileHandle, struct file *file,
242 mutex_init(&pCifsFile->fh_mutex); 243 mutex_init(&pCifsFile->fh_mutex);
243 mutex_init(&pCifsFile->lock_mutex); 244 mutex_init(&pCifsFile->lock_mutex);
244 INIT_LIST_HEAD(&pCifsFile->llist); 245 INIT_LIST_HEAD(&pCifsFile->llist);
245 atomic_set(&pCifsFile->count, 1);
246 INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break); 246 INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break);
247 247
248 spin_lock(&cifs_file_list_lock); 248 spin_lock(&cifs_file_list_lock);
@@ -267,7 +267,8 @@ cifs_new_fileinfo(__u16 fileHandle, struct file *file,
267 267
268/* 268/*
269 * Release a reference on the file private data. This may involve closing 269 * Release a reference on the file private data. This may involve closing
270 * the filehandle out on the server. 270 * the filehandle out on the server. Must be called without holding
271 * cifs_file_list_lock.
271 */ 272 */
272void cifsFileInfo_put(struct cifsFileInfo *cifs_file) 273void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
273{ 274{
@@ -276,7 +277,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
276 struct cifsLockInfo *li, *tmp; 277 struct cifsLockInfo *li, *tmp;
277 278
278 spin_lock(&cifs_file_list_lock); 279 spin_lock(&cifs_file_list_lock);
279 if (!atomic_dec_and_test(&cifs_file->count)) { 280 if (--cifs_file->count > 0) {
280 spin_unlock(&cifs_file_list_lock); 281 spin_unlock(&cifs_file_list_lock);
281 return; 282 return;
282 } 283 }
@@ -2322,6 +2323,7 @@ void cifs_oplock_break(struct work_struct *work)
2322 cifs_oplock_break_put(cfile); 2323 cifs_oplock_break_put(cfile);
2323} 2324}
2324 2325
2326/* must be called while holding cifs_file_list_lock */
2325void cifs_oplock_break_get(struct cifsFileInfo *cfile) 2327void cifs_oplock_break_get(struct cifsFileInfo *cfile)
2326{ 2328{
2327 cifs_sb_active(cfile->dentry->d_sb); 2329 cifs_sb_active(cfile->dentry->d_sb);