Lines Matching refs:cfid

16 static void free_cached_dir(struct cached_fid *cfid);
25 struct cached_fid *cfid; in find_or_create_cached_dir() local
28 list_for_each_entry(cfid, &cfids->entries, entry) { in find_or_create_cached_dir()
29 if (!strcmp(cfid->path, path)) { in find_or_create_cached_dir()
35 if (!cfid->has_lease) { in find_or_create_cached_dir()
39 kref_get(&cfid->refcount); in find_or_create_cached_dir()
41 return cfid; in find_or_create_cached_dir()
52 cfid = init_cached_dir(path); in find_or_create_cached_dir()
53 if (cfid == NULL) { in find_or_create_cached_dir()
57 cfid->cfids = cfids; in find_or_create_cached_dir()
59 list_add(&cfid->entry, &cfids->entries); in find_or_create_cached_dir()
60 cfid->on_list = true; in find_or_create_cached_dir()
61 kref_get(&cfid->refcount); in find_or_create_cached_dir()
63 return cfid; in find_or_create_cached_dir()
145 struct cached_fid *cfid; in open_cached_dir() local
167 cfid = find_or_create_cached_dir(cfids, path, lookup_only, tcon->max_cached_dirs); in open_cached_dir()
168 if (cfid == NULL) { in open_cached_dir()
178 if (cfid->has_lease) { in open_cached_dir()
180 *ret_cfid = cfid; in open_cached_dir()
210 pfid = &cfid->fid; in open_cached_dir()
263 cfid->tcon = tcon; in open_cached_dir()
264 cfid->is_open = true; in open_cached_dir()
289 (char *)&cfid->file_all_info)) in open_cached_dir()
290 cfid->file_all_info_is_valid = true; in open_cached_dir()
302 cfid->dentry = dentry; in open_cached_dir()
303 cfid->time = jiffies; in open_cached_dir()
304 cfid->has_lease = true; in open_cached_dir()
314 if (!cfid->has_lease) { in open_cached_dir()
316 if (cfid->on_list) { in open_cached_dir()
317 list_del(&cfid->entry); in open_cached_dir()
318 cfid->on_list = false; in open_cached_dir()
331 kref_put(&cfid->refcount, smb2_close_cached_fid); in open_cached_dir()
337 if (cfid->is_open) in open_cached_dir()
338 SMB2_close(0, cfid->tcon, cfid->fid.persistent_fid, in open_cached_dir()
339 cfid->fid.volatile_fid); in open_cached_dir()
340 free_cached_dir(cfid); in open_cached_dir()
341 cfid = NULL; in open_cached_dir()
345 *ret_cfid = cfid; in open_cached_dir()
356 struct cached_fid *cfid; in open_cached_dir_by_dentry() local
363 list_for_each_entry(cfid, &cfids->entries, entry) { in open_cached_dir_by_dentry()
364 if (dentry && cfid->dentry == dentry) { in open_cached_dir_by_dentry()
366 kref_get(&cfid->refcount); in open_cached_dir_by_dentry()
367 *ret_cfid = cfid; in open_cached_dir_by_dentry()
379 struct cached_fid *cfid = container_of(ref, struct cached_fid, in smb2_close_cached_fid() local
382 spin_lock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
383 if (cfid->on_list) { in smb2_close_cached_fid()
384 list_del(&cfid->entry); in smb2_close_cached_fid()
385 cfid->on_list = false; in smb2_close_cached_fid()
386 cfid->cfids->num_entries--; in smb2_close_cached_fid()
388 spin_unlock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
390 dput(cfid->dentry); in smb2_close_cached_fid()
391 cfid->dentry = NULL; in smb2_close_cached_fid()
393 if (cfid->is_open) { in smb2_close_cached_fid()
394 SMB2_close(0, cfid->tcon, cfid->fid.persistent_fid, in smb2_close_cached_fid()
395 cfid->fid.volatile_fid); in smb2_close_cached_fid()
396 atomic_dec(&cfid->tcon->num_remote_opens); in smb2_close_cached_fid()
399 free_cached_dir(cfid); in smb2_close_cached_fid()
405 struct cached_fid *cfid = NULL; in drop_cached_dir_by_name() local
408 rc = open_cached_dir(xid, tcon, name, cifs_sb, true, &cfid); in drop_cached_dir_by_name()
413 spin_lock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
414 if (cfid->has_lease) { in drop_cached_dir_by_name()
415 cfid->has_lease = false; in drop_cached_dir_by_name()
416 kref_put(&cfid->refcount, smb2_close_cached_fid); in drop_cached_dir_by_name()
418 spin_unlock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
419 close_cached_dir(cfid); in drop_cached_dir_by_name()
423 void close_cached_dir(struct cached_fid *cfid) in close_cached_dir() argument
425 kref_put(&cfid->refcount, smb2_close_cached_fid); in close_cached_dir()
435 struct cached_fid *cfid; in close_all_cached_dirs() local
448 list_for_each_entry(cfid, &cfids->entries, entry) { in close_all_cached_dirs()
449 dput(cfid->dentry); in close_all_cached_dirs()
450 cfid->dentry = NULL; in close_all_cached_dirs()
462 struct cached_fid *cfid, *q; in invalidate_all_cached_dirs() local
469 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in invalidate_all_cached_dirs()
470 list_move(&cfid->entry, &entry); in invalidate_all_cached_dirs()
472 cfid->is_open = false; in invalidate_all_cached_dirs()
473 cfid->on_list = false; in invalidate_all_cached_dirs()
475 kref_get(&cfid->refcount); in invalidate_all_cached_dirs()
479 list_for_each_entry_safe(cfid, q, &entry, entry) { in invalidate_all_cached_dirs()
480 list_del(&cfid->entry); in invalidate_all_cached_dirs()
481 cancel_work_sync(&cfid->lease_break); in invalidate_all_cached_dirs()
482 if (cfid->has_lease) { in invalidate_all_cached_dirs()
488 cfid->has_lease = false; in invalidate_all_cached_dirs()
490 kref_put(&cfid->refcount, smb2_close_cached_fid); in invalidate_all_cached_dirs()
493 kref_put(&cfid->refcount, smb2_close_cached_fid); in invalidate_all_cached_dirs()
500 struct cached_fid *cfid = container_of(work, in smb2_cached_lease_break() local
503 spin_lock(&cfid->cfids->cfid_list_lock); in smb2_cached_lease_break()
504 cfid->has_lease = false; in smb2_cached_lease_break()
505 spin_unlock(&cfid->cfids->cfid_list_lock); in smb2_cached_lease_break()
506 kref_put(&cfid->refcount, smb2_close_cached_fid); in smb2_cached_lease_break()
512 struct cached_fid *cfid; in cached_dir_lease_break() local
518 list_for_each_entry(cfid, &cfids->entries, entry) { in cached_dir_lease_break()
519 if (cfid->has_lease && in cached_dir_lease_break()
521 cfid->fid.lease_key, in cached_dir_lease_break()
523 cfid->time = 0; in cached_dir_lease_break()
528 list_del(&cfid->entry); in cached_dir_lease_break()
529 cfid->on_list = false; in cached_dir_lease_break()
533 &cfid->lease_break); in cached_dir_lease_break()
544 struct cached_fid *cfid; in init_cached_dir() local
546 cfid = kzalloc(sizeof(*cfid), GFP_ATOMIC); in init_cached_dir()
547 if (!cfid) in init_cached_dir()
549 cfid->path = kstrdup(path, GFP_ATOMIC); in init_cached_dir()
550 if (!cfid->path) { in init_cached_dir()
551 kfree(cfid); in init_cached_dir()
555 INIT_WORK(&cfid->lease_break, smb2_cached_lease_break); in init_cached_dir()
556 INIT_LIST_HEAD(&cfid->entry); in init_cached_dir()
557 INIT_LIST_HEAD(&cfid->dirents.entries); in init_cached_dir()
558 mutex_init(&cfid->dirents.de_mutex); in init_cached_dir()
559 spin_lock_init(&cfid->fid_lock); in init_cached_dir()
560 kref_init(&cfid->refcount); in init_cached_dir()
561 return cfid; in init_cached_dir()
564 static void free_cached_dir(struct cached_fid *cfid) in free_cached_dir() argument
568 dput(cfid->dentry); in free_cached_dir()
569 cfid->dentry = NULL; in free_cached_dir()
574 list_for_each_entry_safe(dirent, q, &cfid->dirents.entries, entry) { in free_cached_dir()
580 kfree(cfid->path); in free_cached_dir()
581 cfid->path = NULL; in free_cached_dir()
582 kfree(cfid); in free_cached_dir()
588 struct cached_fid *cfid, *q; in cfids_laundromat_worker() local
594 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in cfids_laundromat_worker()
595 if (cfid->time && in cfids_laundromat_worker()
596 time_after(jiffies, cfid->time + HZ * dir_cache_timeout)) { in cfids_laundromat_worker()
597 cfid->on_list = false; in cfids_laundromat_worker()
598 list_move(&cfid->entry, &entry); in cfids_laundromat_worker()
601 kref_get(&cfid->refcount); in cfids_laundromat_worker()
606 list_for_each_entry_safe(cfid, q, &entry, entry) { in cfids_laundromat_worker()
607 list_del(&cfid->entry); in cfids_laundromat_worker()
612 cancel_work_sync(&cfid->lease_break); in cfids_laundromat_worker()
613 if (cfid->has_lease) { in cfids_laundromat_worker()
619 cfid->has_lease = false; in cfids_laundromat_worker()
621 kref_put(&cfid->refcount, smb2_close_cached_fid); in cfids_laundromat_worker()
624 kref_put(&cfid->refcount, smb2_close_cached_fid); in cfids_laundromat_worker()
653 struct cached_fid *cfid, *q; in free_cached_dirs() local
662 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in free_cached_dirs()
663 cfid->on_list = false; in free_cached_dirs()
664 cfid->is_open = false; in free_cached_dirs()
665 list_move(&cfid->entry, &entry); in free_cached_dirs()
669 list_for_each_entry_safe(cfid, q, &entry, entry) { in free_cached_dirs()
670 list_del(&cfid->entry); in free_cached_dirs()
671 free_cached_dir(cfid); in free_cached_dirs()