Lines Matching refs:cfid

16 static void free_cached_dir(struct cached_fid *cfid);
30 struct cached_fid *cfid; in find_or_create_cached_dir() local
32 list_for_each_entry(cfid, &cfids->entries, entry) { in find_or_create_cached_dir()
33 if (!strcmp(cfid->path, path)) { in find_or_create_cached_dir()
39 if (!cfid->time || !cfid->has_lease) { in find_or_create_cached_dir()
42 kref_get(&cfid->refcount); in find_or_create_cached_dir()
43 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()
56 cfid->cfids = cfids; in find_or_create_cached_dir()
58 list_add(&cfid->entry, &cfids->entries); in find_or_create_cached_dir()
59 cfid->on_list = true; in find_or_create_cached_dir()
60 kref_get(&cfid->refcount); in find_or_create_cached_dir()
69 cfid->has_lease = true; in find_or_create_cached_dir()
71 return cfid; in find_or_create_cached_dir()
154 struct cached_fid *cfid; in open_cached_dir() local
186 cfid = find_or_create_cached_dir(cfids, path, lookup_only, tcon->max_cached_dirs); in open_cached_dir()
187 if (cfid == NULL) { in open_cached_dir()
197 if (cfid->has_lease && cfid->time) { in open_cached_dir()
198 cfid->last_access_time = jiffies; in open_cached_dir()
200 *ret_cfid = cfid; in open_cached_dir()
206 pfid = &cfid->fid; in open_cached_dir()
249 cfid->dentry = dentry; in open_cached_dir()
250 cfid->tcon = tcon; in open_cached_dir()
322 cfid->is_open = true; in open_cached_dir()
363 (char *)&cfid->file_all_info)) in open_cached_dir()
364 cfid->file_all_info_is_valid = true; in open_cached_dir()
366 cfid->time = jiffies; in open_cached_dir()
367 cfid->last_access_time = jiffies; in open_cached_dir()
380 if (cfid->on_list) { in open_cached_dir()
381 list_del(&cfid->entry); in open_cached_dir()
382 cfid->on_list = false; in open_cached_dir()
385 if (cfid->has_lease) { in open_cached_dir()
391 cfid->has_lease = false; in open_cached_dir()
392 kref_put(&cfid->refcount, smb2_close_cached_fid); in open_cached_dir()
396 kref_put(&cfid->refcount, smb2_close_cached_fid); in open_cached_dir()
398 *ret_cfid = cfid; in open_cached_dir()
414 struct cached_fid *cfid; in open_cached_dir_by_dentry() local
421 list_for_each_entry(cfid, &cfids->entries, entry) { in open_cached_dir_by_dentry()
422 if (dentry && cfid->dentry == dentry) { in open_cached_dir_by_dentry()
424 kref_get(&cfid->refcount); in open_cached_dir_by_dentry()
425 *ret_cfid = cfid; in open_cached_dir_by_dentry()
437 struct cached_fid *cfid = container_of(ref, struct cached_fid, in smb2_close_cached_fid() local
441 spin_lock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
442 if (cfid->on_list) { in smb2_close_cached_fid()
443 list_del(&cfid->entry); in smb2_close_cached_fid()
444 cfid->on_list = false; in smb2_close_cached_fid()
445 cfid->cfids->num_entries--; in smb2_close_cached_fid()
447 spin_unlock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
449 dput(cfid->dentry); in smb2_close_cached_fid()
450 cfid->dentry = NULL; in smb2_close_cached_fid()
452 if (cfid->is_open) { in smb2_close_cached_fid()
453 rc = SMB2_close(0, cfid->tcon, cfid->fid.persistent_fid, in smb2_close_cached_fid()
454 cfid->fid.volatile_fid); in smb2_close_cached_fid()
459 free_cached_dir(cfid); in smb2_close_cached_fid()
465 struct cached_fid *cfid = NULL; in drop_cached_dir_by_name() local
468 rc = open_cached_dir(xid, tcon, name, cifs_sb, true, &cfid); in drop_cached_dir_by_name()
473 spin_lock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
474 if (cfid->has_lease) { in drop_cached_dir_by_name()
475 cfid->has_lease = false; in drop_cached_dir_by_name()
476 kref_put(&cfid->refcount, smb2_close_cached_fid); in drop_cached_dir_by_name()
478 spin_unlock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
479 close_cached_dir(cfid); in drop_cached_dir_by_name()
483 void close_cached_dir(struct cached_fid *cfid) in close_cached_dir() argument
485 kref_put(&cfid->refcount, smb2_close_cached_fid); in close_cached_dir()
495 struct cached_fid *cfid; in close_all_cached_dirs() local
512 list_for_each_entry(cfid, &cfids->entries, entry) { in close_all_cached_dirs()
525 spin_lock(&cfid->fid_lock); in close_all_cached_dirs()
526 tmp_list->dentry = cfid->dentry; in close_all_cached_dirs()
527 cfid->dentry = NULL; in close_all_cached_dirs()
528 spin_unlock(&cfid->fid_lock); in close_all_cached_dirs()
554 struct cached_fid *cfid, *q; in invalidate_all_cached_dirs() local
565 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in invalidate_all_cached_dirs()
566 list_move(&cfid->entry, &cfids->dying); in invalidate_all_cached_dirs()
568 cfid->is_open = false; in invalidate_all_cached_dirs()
569 cfid->on_list = false; in invalidate_all_cached_dirs()
570 if (cfid->has_lease) { in invalidate_all_cached_dirs()
575 cfid->has_lease = false; in invalidate_all_cached_dirs()
577 kref_get(&cfid->refcount); in invalidate_all_cached_dirs()
590 struct cached_fid *cfid = container_of(work, in cached_dir_offload_close() local
592 struct cifs_tcon *tcon = cfid->tcon; in cached_dir_offload_close()
594 WARN_ON(cfid->on_list); in cached_dir_offload_close()
596 kref_put(&cfid->refcount, smb2_close_cached_fid); in cached_dir_offload_close()
609 struct cached_fid *cfid = container_of(work, struct cached_fid, in cached_dir_put_work() local
613 spin_lock(&cfid->fid_lock); in cached_dir_put_work()
614 dentry = cfid->dentry; in cached_dir_put_work()
615 cfid->dentry = NULL; in cached_dir_put_work()
616 spin_unlock(&cfid->fid_lock); in cached_dir_put_work()
619 queue_work(serverclose_wq, &cfid->close_work); in cached_dir_put_work()
625 struct cached_fid *cfid; in cached_dir_lease_break() local
631 list_for_each_entry(cfid, &cfids->entries, entry) { in cached_dir_lease_break()
632 if (cfid->has_lease && in cached_dir_lease_break()
634 cfid->fid.lease_key, in cached_dir_lease_break()
636 cfid->has_lease = false; in cached_dir_lease_break()
637 cfid->time = 0; in cached_dir_lease_break()
642 list_del(&cfid->entry); in cached_dir_lease_break()
643 cfid->on_list = false; in cached_dir_lease_break()
649 queue_work(cfid_put_wq, &cfid->put_work); in cached_dir_lease_break()
660 struct cached_fid *cfid; in init_cached_dir() local
662 cfid = kzalloc(sizeof(*cfid), GFP_ATOMIC); in init_cached_dir()
663 if (!cfid) in init_cached_dir()
665 cfid->path = kstrdup(path, GFP_ATOMIC); in init_cached_dir()
666 if (!cfid->path) { in init_cached_dir()
667 kfree(cfid); in init_cached_dir()
671 INIT_WORK(&cfid->close_work, cached_dir_offload_close); in init_cached_dir()
672 INIT_WORK(&cfid->put_work, cached_dir_put_work); in init_cached_dir()
673 INIT_LIST_HEAD(&cfid->entry); in init_cached_dir()
674 INIT_LIST_HEAD(&cfid->dirents.entries); in init_cached_dir()
675 mutex_init(&cfid->dirents.de_mutex); in init_cached_dir()
676 spin_lock_init(&cfid->fid_lock); in init_cached_dir()
677 kref_init(&cfid->refcount); in init_cached_dir()
678 return cfid; in init_cached_dir()
681 static void free_cached_dir(struct cached_fid *cfid) in free_cached_dir() argument
685 WARN_ON(work_pending(&cfid->close_work)); in free_cached_dir()
686 WARN_ON(work_pending(&cfid->put_work)); in free_cached_dir()
688 dput(cfid->dentry); in free_cached_dir()
689 cfid->dentry = NULL; in free_cached_dir()
694 list_for_each_entry_safe(dirent, q, &cfid->dirents.entries, entry) { in free_cached_dir()
700 kfree(cfid->path); in free_cached_dir()
701 cfid->path = NULL; in free_cached_dir()
702 kfree(cfid); in free_cached_dir()
709 struct cached_fid *cfid, *q; in cfids_invalidation_worker() local
717 list_for_each_entry_safe(cfid, q, &entry, entry) { in cfids_invalidation_worker()
718 list_del(&cfid->entry); in cfids_invalidation_worker()
720 kref_put(&cfid->refcount, smb2_close_cached_fid); in cfids_invalidation_worker()
727 struct cached_fid *cfid, *q; in cfids_laundromat_worker() local
734 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in cfids_laundromat_worker()
735 if (cfid->last_access_time && in cfids_laundromat_worker()
736 time_after(jiffies, cfid->last_access_time + HZ * dir_cache_timeout)) { in cfids_laundromat_worker()
737 cfid->on_list = false; in cfids_laundromat_worker()
738 list_move(&cfid->entry, &entry); in cfids_laundromat_worker()
740 if (cfid->has_lease) { in cfids_laundromat_worker()
745 cfid->has_lease = false; in cfids_laundromat_worker()
747 kref_get(&cfid->refcount); in cfids_laundromat_worker()
752 list_for_each_entry_safe(cfid, q, &entry, entry) { in cfids_laundromat_worker()
753 list_del(&cfid->entry); in cfids_laundromat_worker()
755 spin_lock(&cfid->fid_lock); in cfids_laundromat_worker()
756 dentry = cfid->dentry; in cfids_laundromat_worker()
757 cfid->dentry = NULL; in cfids_laundromat_worker()
758 spin_unlock(&cfid->fid_lock); in cfids_laundromat_worker()
761 if (cfid->is_open) { in cfids_laundromat_worker()
763 ++cfid->tcon->tc_count; in cfids_laundromat_worker()
764 trace_smb3_tcon_ref(cfid->tcon->debug_id, cfid->tcon->tc_count, in cfids_laundromat_worker()
767 queue_work(serverclose_wq, &cfid->close_work); in cfids_laundromat_worker()
773 kref_put(&cfid->refcount, smb2_close_cached_fid); in cfids_laundromat_worker()
804 struct cached_fid *cfid, *q; in free_cached_dirs() local
814 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in free_cached_dirs()
815 cfid->on_list = false; in free_cached_dirs()
816 cfid->is_open = false; in free_cached_dirs()
817 list_move(&cfid->entry, &entry); in free_cached_dirs()
819 list_for_each_entry_safe(cfid, q, &cfids->dying, entry) { in free_cached_dirs()
820 cfid->on_list = false; in free_cached_dirs()
821 cfid->is_open = false; in free_cached_dirs()
822 list_move(&cfid->entry, &entry); in free_cached_dirs()
826 list_for_each_entry_safe(cfid, q, &entry, entry) { in free_cached_dirs()
827 list_del(&cfid->entry); in free_cached_dirs()
828 free_cached_dir(cfid); in free_cached_dirs()