diff options
author | Jeff Layton <jlayton@redhat.com> | 2010-10-15 15:34:06 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2010-10-24 20:18:59 -0400 |
commit | 5f6dbc9e4afe4d1d39e85de3ac2720a2042ad191 (patch) | |
tree | 8e97fe18b6d0824981fd377b2ff35042da264bb4 /fs/cifs/file.c | |
parent | 229aebb873e29726b91e076161649cf45154b0bf (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.c | 8 |
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 | */ |
272 | void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | 273 | void 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 */ | ||
2325 | void cifs_oplock_break_get(struct cifsFileInfo *cfile) | 2327 | void 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); |