aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/cifsglob.h9
-rw-r--r--fs/cifs/file.c8
2 files changed, 11 insertions, 6 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 3365e77f6f24..6319db025e7b 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -395,16 +395,19 @@ struct cifsFileInfo {
395 struct list_head llist; /* list of byte range locks we have. */ 395 struct list_head llist; /* list of byte range locks we have. */
396 bool invalidHandle:1; /* file closed via session abend */ 396 bool invalidHandle:1; /* file closed via session abend */
397 bool oplock_break_cancelled:1; 397 bool oplock_break_cancelled:1;
398 atomic_t count; /* reference count */ 398 int count; /* refcount -- protected by cifs_file_list_lock */
399 struct mutex fh_mutex; /* prevents reopen race after dead ses*/ 399 struct mutex fh_mutex; /* prevents reopen race after dead ses*/
400 struct cifs_search_info srch_inf; 400 struct cifs_search_info srch_inf;
401 struct work_struct oplock_break; /* work for oplock breaks */ 401 struct work_struct oplock_break; /* work for oplock breaks */
402}; 402};
403 403
404/* Take a reference on the file private data */ 404/*
405 * Take a reference on the file private data. Must be called with
406 * cifs_file_list_lock held.
407 */
405static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file) 408static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file)
406{ 409{
407 atomic_inc(&cifs_file->count); 410 ++cifs_file->count;
408} 411}
409 412
410void cifsFileInfo_put(struct cifsFileInfo *cifs_file); 413void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
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);