Lines Matching full:fp
72 struct ksmbd_file *fp = NULL; in proc_show_files() local
82 idr_for_each_entry(global_ft.idr, fp, id) { in proc_show_files()
84 fp->tcon->id, in proc_show_files()
85 fp->persistent_id, in proc_show_files()
86 fp->volatile_id, in proc_show_files()
87 atomic_read(&fp->refcount)); in proc_show_files()
90 opinfo = rcu_dereference(fp->f_opinfo); in proc_show_files()
114 le32_to_cpu(fp->daccess), in proc_show_files()
115 le32_to_cpu(fp->saccess), in proc_show_files()
116 fp->filp->f_path.dentry->d_name.name); in proc_show_files()
186 static struct ksmbd_inode *ksmbd_inode_lookup(struct ksmbd_file *fp) in ksmbd_inode_lookup() argument
188 return __ksmbd_inode_lookup(fp->filp->f_path.dentry); in ksmbd_inode_lookup()
224 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_inode_pending_delete() argument
226 struct ksmbd_inode *ci = fp->f_ci; in ksmbd_inode_pending_delete()
236 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_set_inode_pending_delete() argument
238 struct ksmbd_inode *ci = fp->f_ci; in ksmbd_set_inode_pending_delete()
245 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_clear_inode_pending_delete() argument
247 struct ksmbd_inode *ci = fp->f_ci; in ksmbd_clear_inode_pending_delete()
254 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, in ksmbd_fd_set_delete_on_close() argument
257 struct ksmbd_inode *ci = fp->f_ci; in ksmbd_fd_set_delete_on_close()
260 if (ksmbd_stream_fd(fp)) in ksmbd_fd_set_delete_on_close()
282 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp) in ksmbd_inode_init() argument
292 ci->m_de = fp->filp->f_path.dentry; in ksmbd_inode_init()
296 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp) in ksmbd_inode_get() argument
302 ci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
311 rc = ksmbd_inode_init(ci, fp); in ksmbd_inode_get()
319 tmpci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
354 /* init master fp hash table */ in ksmbd_inode_hash_init()
369 static void __ksmbd_inode_close(struct ksmbd_file *fp) in __ksmbd_inode_close() argument
371 struct ksmbd_inode *ci = fp->f_ci; in __ksmbd_inode_close()
375 filp = fp->filp; in __ksmbd_inode_close()
377 if (ksmbd_stream_fd(fp)) { in __ksmbd_inode_close()
390 fp->stream.name, in __ksmbd_inode_close()
394 fp->stream.name); in __ksmbd_inode_close()
415 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp) in __ksmbd_remove_durable_fd() argument
417 if (!has_file_id(fp->persistent_id)) in __ksmbd_remove_durable_fd()
420 idr_remove(global_ft.idr, fp->persistent_id); in __ksmbd_remove_durable_fd()
423 static void ksmbd_remove_durable_fd(struct ksmbd_file *fp) in ksmbd_remove_durable_fd() argument
426 __ksmbd_remove_durable_fd(fp); in ksmbd_remove_durable_fd()
432 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_remove_fd() argument
434 if (!has_file_id(fp->volatile_id)) in __ksmbd_remove_fd()
437 down_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
438 list_del_init(&fp->node); in __ksmbd_remove_fd()
439 up_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
442 idr_remove(ft->idr, fp->volatile_id); in __ksmbd_remove_fd()
446 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_close_fd() argument
452 ksmbd_remove_durable_fd(fp); in __ksmbd_close_fd()
454 __ksmbd_remove_fd(ft, fp); in __ksmbd_close_fd()
456 close_id_del_oplock(fp); in __ksmbd_close_fd()
457 filp = fp->filp; in __ksmbd_close_fd()
459 __ksmbd_inode_close(fp); in __ksmbd_close_fd()
463 /* because the reference count of fp is 0, it is guaranteed that in __ksmbd_close_fd()
464 * there are not accesses to fp->lock_list. in __ksmbd_close_fd()
466 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in __ksmbd_close_fd()
467 if (!list_empty(&smb_lock->clist) && fp->conn) { in __ksmbd_close_fd()
468 spin_lock(&fp->conn->llist_lock); in __ksmbd_close_fd()
470 spin_unlock(&fp->conn->llist_lock); in __ksmbd_close_fd()
478 if (ksmbd_stream_fd(fp)) in __ksmbd_close_fd()
479 kfree(fp->stream.name); in __ksmbd_close_fd()
480 kfree(fp->owner.name); in __ksmbd_close_fd()
482 kmem_cache_free(filp_cache, fp); in __ksmbd_close_fd()
485 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp) in ksmbd_fp_get() argument
487 if (fp->f_state != FP_INITED) in ksmbd_fp_get()
490 if (!atomic_inc_not_zero(&fp->refcount)) in ksmbd_fp_get()
492 return fp; in ksmbd_fp_get()
498 struct ksmbd_file *fp; in __ksmbd_lookup_fd() local
504 fp = idr_find(ft->idr, id); in __ksmbd_lookup_fd()
505 if (fp) in __ksmbd_lookup_fd()
506 fp = ksmbd_fp_get(fp); in __ksmbd_lookup_fd()
508 return fp; in __ksmbd_lookup_fd()
511 static void __put_fd_final(struct ksmbd_work *work, struct ksmbd_file *fp) in __put_fd_final() argument
513 __ksmbd_close_fd(&work->sess->file_table, fp); in __put_fd_final()
517 static void set_close_state_blocked_works(struct ksmbd_file *fp) in set_close_state_blocked_works() argument
521 spin_lock(&fp->f_lock); in set_close_state_blocked_works()
522 list_for_each_entry(cancel_work, &fp->blocked_works, in set_close_state_blocked_works()
527 spin_unlock(&fp->f_lock); in set_close_state_blocked_works()
532 struct ksmbd_file *fp; in ksmbd_close_fd() local
540 fp = idr_find(ft->idr, id); in ksmbd_close_fd()
541 if (fp) { in ksmbd_close_fd()
542 set_close_state_blocked_works(fp); in ksmbd_close_fd()
544 if (fp->f_state != FP_INITED) in ksmbd_close_fd()
545 fp = NULL; in ksmbd_close_fd()
547 fp->f_state = FP_CLOSED; in ksmbd_close_fd()
548 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
549 fp = NULL; in ksmbd_close_fd()
554 if (!fp) in ksmbd_close_fd()
557 __put_fd_final(work, fp); in ksmbd_close_fd()
561 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
563 if (!fp) in ksmbd_fd_put()
566 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
568 __put_fd_final(work, fp); in ksmbd_fd_put()
571 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
573 if (!fp) in __sanity_check()
575 if (fp->tcon != tcon) in __sanity_check()
587 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
589 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
590 return fp; in ksmbd_lookup_fd_fast()
592 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
599 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
606 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
607 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
608 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
611 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
612 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
615 return fp; in ksmbd_lookup_fd_slow()
625 struct ksmbd_file *fp; in ksmbd_lookup_durable_fd() local
627 fp = __ksmbd_lookup_fd(&global_ft, id); in ksmbd_lookup_durable_fd()
628 if (fp && (fp->conn || in ksmbd_lookup_durable_fd()
629 (fp->durable_scavenger_timeout && in ksmbd_lookup_durable_fd()
630 (fp->durable_scavenger_timeout < in ksmbd_lookup_durable_fd()
632 ksmbd_put_durable_fd(fp); in ksmbd_lookup_durable_fd()
633 fp = NULL; in ksmbd_lookup_durable_fd()
636 return fp; in ksmbd_lookup_durable_fd()
639 void ksmbd_put_durable_fd(struct ksmbd_file *fp) in ksmbd_put_durable_fd() argument
641 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_put_durable_fd()
644 __ksmbd_close_fd(NULL, fp); in ksmbd_put_durable_fd()
649 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
653 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
654 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
657 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
663 return fp; in ksmbd_lookup_fd_cguid()
695 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type) in __open_id_set() argument
698 fp->volatile_id = id; in __open_id_set()
700 fp->persistent_id = id; in __open_id_set()
703 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in __open_id() argument
710 __open_id_set(fp, KSMBD_NO_FID, type); in __open_id()
716 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT); in __open_id()
725 __open_id_set(fp, id, type); in __open_id()
731 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp) in ksmbd_open_durable_fd() argument
733 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID); in ksmbd_open_durable_fd()
734 return fp->persistent_id; in ksmbd_open_durable_fd()
739 struct ksmbd_file *fp; in ksmbd_open_fd() local
742 fp = kmem_cache_zalloc(filp_cache, KSMBD_DEFAULT_GFP); in ksmbd_open_fd()
743 if (!fp) { in ksmbd_open_fd()
748 INIT_LIST_HEAD(&fp->blocked_works); in ksmbd_open_fd()
749 INIT_LIST_HEAD(&fp->node); in ksmbd_open_fd()
750 INIT_LIST_HEAD(&fp->lock_list); in ksmbd_open_fd()
751 spin_lock_init(&fp->f_lock); in ksmbd_open_fd()
752 atomic_set(&fp->refcount, 1); in ksmbd_open_fd()
754 fp->filp = filp; in ksmbd_open_fd()
755 fp->conn = work->conn; in ksmbd_open_fd()
756 fp->tcon = work->tcon; in ksmbd_open_fd()
757 fp->volatile_id = KSMBD_NO_FID; in ksmbd_open_fd()
758 fp->persistent_id = KSMBD_NO_FID; in ksmbd_open_fd()
759 fp->f_state = FP_NEW; in ksmbd_open_fd()
760 fp->f_ci = ksmbd_inode_get(fp); in ksmbd_open_fd()
762 if (!fp->f_ci) { in ksmbd_open_fd()
767 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_open_fd()
769 ksmbd_inode_put(fp->f_ci); in ksmbd_open_fd()
774 return fp; in ksmbd_open_fd()
777 kmem_cache_free(filp_cache, fp); in ksmbd_open_fd()
781 void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in ksmbd_update_fstate() argument
784 if (!fp) in ksmbd_update_fstate()
788 fp->f_state = state; in ksmbd_update_fstate()
796 struct ksmbd_file *fp, in __close_file_table_ids() argument
800 struct ksmbd_file *fp; in __close_file_table_ids() local
806 fp = idr_get_next(ft->idr, &id); in __close_file_table_ids()
807 if (!fp) { in __close_file_table_ids()
812 if (skip(tcon, fp, sess->user) || in __close_file_table_ids()
813 !atomic_dec_and_test(&fp->refcount)) { in __close_file_table_ids()
819 set_close_state_blocked_works(fp); in __close_file_table_ids()
820 idr_remove(ft->idr, fp->volatile_id); in __close_file_table_ids()
821 fp->volatile_id = KSMBD_NO_FID; in __close_file_table_ids()
824 down_write(&fp->f_ci->m_lock); in __close_file_table_ids()
825 list_del_init(&fp->node); in __close_file_table_ids()
826 up_write(&fp->f_ci->m_lock); in __close_file_table_ids()
828 __ksmbd_close_fd(ft, fp); in __close_file_table_ids()
837 static inline bool is_reconnectable(struct ksmbd_file *fp) in is_reconnectable() argument
839 struct oplock_info *opinfo = opinfo_get(fp); in is_reconnectable()
850 if (fp->is_resilient || fp->is_persistent) in is_reconnectable()
852 else if (fp->is_durable && opinfo->is_lease && in is_reconnectable()
856 else if (fp->is_durable && opinfo->level == SMB2_OPLOCK_LEVEL_BATCH) in is_reconnectable()
864 struct ksmbd_file *fp, in tree_conn_fd_check() argument
867 return fp->tcon != tcon; in tree_conn_fd_check()
887 struct ksmbd_file *fp; in ksmbd_scavenger_dispose_dh() local
889 fp = list_first_entry(head, struct ksmbd_file, node); in ksmbd_scavenger_dispose_dh()
890 list_del_init(&fp->node); in ksmbd_scavenger_dispose_dh()
891 __ksmbd_close_fd(NULL, fp); in ksmbd_scavenger_dispose_dh()
897 struct ksmbd_file *fp = NULL; in ksmbd_durable_scavenger() local
922 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_durable_scavenger()
923 if (!fp->durable_timeout) in ksmbd_durable_scavenger()
926 if (atomic_read(&fp->refcount) > 1 || in ksmbd_durable_scavenger()
927 fp->conn) in ksmbd_durable_scavenger()
931 if (fp->durable_scavenger_timeout <= in ksmbd_durable_scavenger()
933 __ksmbd_remove_durable_fd(fp); in ksmbd_durable_scavenger()
934 list_add(&fp->node, &scavenger_list); in ksmbd_durable_scavenger()
939 fp->durable_scavenger_timeout - in ksmbd_durable_scavenger()
1002 * @fp: ksmbd file pointer to store owner info
1010 static int ksmbd_vfs_copy_durable_owner(struct ksmbd_file *fp, in ksmbd_vfs_copy_durable_owner() argument
1017 fp->owner.name = kstrdup(user->name, GFP_KERNEL); in ksmbd_vfs_copy_durable_owner()
1018 if (!fp->owner.name) in ksmbd_vfs_copy_durable_owner()
1021 fp->owner.uid = user->uid; in ksmbd_vfs_copy_durable_owner()
1022 fp->owner.gid = user->gid; in ksmbd_vfs_copy_durable_owner()
1029 * @fp: existing ksmbd file pointer
1037 bool ksmbd_vfs_compare_durable_owner(struct ksmbd_file *fp, in ksmbd_vfs_compare_durable_owner() argument
1040 if (!user || !fp->owner.name) in ksmbd_vfs_compare_durable_owner()
1044 if (fp->owner.uid != user->uid || fp->owner.gid != user->gid) in ksmbd_vfs_compare_durable_owner()
1048 if (strcmp(fp->owner.name, user->name)) in ksmbd_vfs_compare_durable_owner()
1055 struct ksmbd_file *fp, struct ksmbd_user *user) in session_fd_check() argument
1062 if (!is_reconnectable(fp)) in session_fd_check()
1065 if (ksmbd_vfs_copy_durable_owner(fp, user)) in session_fd_check()
1068 conn = fp->conn; in session_fd_check()
1069 ci = fp->f_ci; in session_fd_check()
1080 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in session_fd_check()
1081 spin_lock(&fp->conn->llist_lock); in session_fd_check()
1083 spin_unlock(&fp->conn->llist_lock); in session_fd_check()
1086 fp->conn = NULL; in session_fd_check()
1087 fp->tcon = NULL; in session_fd_check()
1088 fp->volatile_id = KSMBD_NO_FID; in session_fd_check()
1090 if (fp->durable_timeout) in session_fd_check()
1091 fp->durable_scavenger_timeout = in session_fd_check()
1092 jiffies_to_msecs(jiffies) + fp->durable_timeout; in session_fd_check()
1123 struct ksmbd_file *fp = NULL; in ksmbd_free_global_file_table() local
1126 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_free_global_file_table()
1127 ksmbd_remove_durable_fd(fp); in ksmbd_free_global_file_table()
1128 __ksmbd_close_fd(NULL, fp); in ksmbd_free_global_file_table()
1136 struct ksmbd_file *fp, char *name) in ksmbd_validate_name_reconnect() argument
1145 ab_pathname = d_path(&fp->filp->f_path, pathname, PATH_MAX); in ksmbd_validate_name_reconnect()
1161 int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_reopen_durable_fd() argument
1169 if (!fp->is_durable || fp->conn || fp->tcon) { in ksmbd_reopen_durable_fd()
1170 pr_err("Invalid durable fd [%p:%p]\n", fp->conn, fp->tcon); in ksmbd_reopen_durable_fd()
1174 if (has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
1175 pr_err("Still in use durable fd: %llu\n", fp->volatile_id); in ksmbd_reopen_durable_fd()
1179 old_f_state = fp->f_state; in ksmbd_reopen_durable_fd()
1180 fp->f_state = FP_NEW; in ksmbd_reopen_durable_fd()
1181 __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_reopen_durable_fd()
1182 if (!has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
1183 fp->f_state = old_f_state; in ksmbd_reopen_durable_fd()
1187 fp->conn = conn; in ksmbd_reopen_durable_fd()
1188 fp->tcon = work->tcon; in ksmbd_reopen_durable_fd()
1190 list_for_each_entry(smb_lock, &fp->lock_list, flist) { in ksmbd_reopen_durable_fd()
1196 ci = fp->f_ci; in ksmbd_reopen_durable_fd()
1201 op->conn = fp->conn; in ksmbd_reopen_durable_fd()
1206 fp->owner.uid = fp->owner.gid = 0; in ksmbd_reopen_durable_fd()
1207 kfree(fp->owner.name); in ksmbd_reopen_durable_fd()
1208 fp->owner.name = NULL; in ksmbd_reopen_durable_fd()