Lines Matching refs:fp
92 static struct ksmbd_inode *ksmbd_inode_lookup(struct ksmbd_file *fp) in ksmbd_inode_lookup() argument
94 return __ksmbd_inode_lookup(fp->filp->f_path.dentry); in ksmbd_inode_lookup()
125 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_inode_pending_delete() argument
127 return (fp->f_ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS)); in ksmbd_inode_pending_delete()
130 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_set_inode_pending_delete() argument
132 fp->f_ci->m_flags |= S_DEL_PENDING; in ksmbd_set_inode_pending_delete()
135 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_clear_inode_pending_delete() argument
137 fp->f_ci->m_flags &= ~S_DEL_PENDING; in ksmbd_clear_inode_pending_delete()
140 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, in ksmbd_fd_set_delete_on_close() argument
143 if (ksmbd_stream_fd(fp)) { in ksmbd_fd_set_delete_on_close()
144 fp->f_ci->m_flags |= S_DEL_ON_CLS_STREAM; in ksmbd_fd_set_delete_on_close()
148 fp->f_ci->m_flags |= S_DEL_ON_CLS; in ksmbd_fd_set_delete_on_close()
166 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp) in ksmbd_inode_init() argument
176 ci->m_de = fp->filp->f_path.dentry; in ksmbd_inode_init()
180 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp) in ksmbd_inode_get() argument
186 ci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
195 rc = ksmbd_inode_init(ci, fp); in ksmbd_inode_get()
203 tmpci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
253 static void __ksmbd_inode_close(struct ksmbd_file *fp) in __ksmbd_inode_close() argument
255 struct ksmbd_inode *ci = fp->f_ci; in __ksmbd_inode_close()
259 filp = fp->filp; in __ksmbd_inode_close()
260 if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) { in __ksmbd_inode_close()
264 fp->stream.name, in __ksmbd_inode_close()
268 fp->stream.name); in __ksmbd_inode_close()
285 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp) in __ksmbd_remove_durable_fd() argument
287 if (!has_file_id(fp->persistent_id)) in __ksmbd_remove_durable_fd()
290 idr_remove(global_ft.idr, fp->persistent_id); in __ksmbd_remove_durable_fd()
293 static void ksmbd_remove_durable_fd(struct ksmbd_file *fp) in ksmbd_remove_durable_fd() argument
296 __ksmbd_remove_durable_fd(fp); in ksmbd_remove_durable_fd()
302 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_remove_fd() argument
304 if (!has_file_id(fp->volatile_id)) in __ksmbd_remove_fd()
307 down_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
308 list_del_init(&fp->node); in __ksmbd_remove_fd()
309 up_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
312 idr_remove(ft->idr, fp->volatile_id); in __ksmbd_remove_fd()
316 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_close_fd() argument
322 ksmbd_remove_durable_fd(fp); in __ksmbd_close_fd()
324 __ksmbd_remove_fd(ft, fp); in __ksmbd_close_fd()
326 close_id_del_oplock(fp); in __ksmbd_close_fd()
327 filp = fp->filp; in __ksmbd_close_fd()
329 __ksmbd_inode_close(fp); in __ksmbd_close_fd()
336 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in __ksmbd_close_fd()
337 spin_lock(&fp->conn->llist_lock); in __ksmbd_close_fd()
339 spin_unlock(&fp->conn->llist_lock); in __ksmbd_close_fd()
346 if (ksmbd_stream_fd(fp)) in __ksmbd_close_fd()
347 kfree(fp->stream.name); in __ksmbd_close_fd()
348 kmem_cache_free(filp_cache, fp); in __ksmbd_close_fd()
351 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp) in ksmbd_fp_get() argument
353 if (fp->f_state != FP_INITED) in ksmbd_fp_get()
356 if (!atomic_inc_not_zero(&fp->refcount)) in ksmbd_fp_get()
358 return fp; in ksmbd_fp_get()
364 struct ksmbd_file *fp; in __ksmbd_lookup_fd() local
370 fp = idr_find(ft->idr, id); in __ksmbd_lookup_fd()
371 if (fp) in __ksmbd_lookup_fd()
372 fp = ksmbd_fp_get(fp); in __ksmbd_lookup_fd()
374 return fp; in __ksmbd_lookup_fd()
377 static void __put_fd_final(struct ksmbd_work *work, struct ksmbd_file *fp) in __put_fd_final() argument
379 __ksmbd_close_fd(&work->sess->file_table, fp); in __put_fd_final()
383 static void set_close_state_blocked_works(struct ksmbd_file *fp) in set_close_state_blocked_works() argument
387 spin_lock(&fp->f_lock); in set_close_state_blocked_works()
388 list_for_each_entry(cancel_work, &fp->blocked_works, in set_close_state_blocked_works()
393 spin_unlock(&fp->f_lock); in set_close_state_blocked_works()
398 struct ksmbd_file *fp; in ksmbd_close_fd() local
406 fp = idr_find(ft->idr, id); in ksmbd_close_fd()
407 if (fp) { in ksmbd_close_fd()
408 set_close_state_blocked_works(fp); in ksmbd_close_fd()
410 if (fp->f_state != FP_INITED) in ksmbd_close_fd()
411 fp = NULL; in ksmbd_close_fd()
413 fp->f_state = FP_CLOSED; in ksmbd_close_fd()
414 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
415 fp = NULL; in ksmbd_close_fd()
420 if (!fp) in ksmbd_close_fd()
423 __put_fd_final(work, fp); in ksmbd_close_fd()
427 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
429 if (!fp) in ksmbd_fd_put()
432 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
434 __put_fd_final(work, fp); in ksmbd_fd_put()
437 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
439 if (!fp) in __sanity_check()
441 if (fp->tcon != tcon) in __sanity_check()
453 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
455 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
456 return fp; in ksmbd_lookup_fd_fast()
458 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
465 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
472 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
473 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
474 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
477 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
478 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
481 return fp; in ksmbd_lookup_fd_slow()
491 struct ksmbd_file *fp; in ksmbd_lookup_durable_fd() local
493 fp = __ksmbd_lookup_fd(&global_ft, id); in ksmbd_lookup_durable_fd()
494 if (fp && (fp->conn || in ksmbd_lookup_durable_fd()
495 (fp->durable_scavenger_timeout && in ksmbd_lookup_durable_fd()
496 (fp->durable_scavenger_timeout < in ksmbd_lookup_durable_fd()
498 ksmbd_put_durable_fd(fp); in ksmbd_lookup_durable_fd()
499 fp = NULL; in ksmbd_lookup_durable_fd()
502 return fp; in ksmbd_lookup_durable_fd()
505 void ksmbd_put_durable_fd(struct ksmbd_file *fp) in ksmbd_put_durable_fd() argument
507 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_put_durable_fd()
510 __ksmbd_close_fd(NULL, fp); in ksmbd_put_durable_fd()
515 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
519 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
520 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
523 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
529 return fp; in ksmbd_lookup_fd_cguid()
561 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type) in __open_id_set() argument
564 fp->volatile_id = id; in __open_id_set()
566 fp->persistent_id = id; in __open_id_set()
569 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in __open_id() argument
576 __open_id_set(fp, KSMBD_NO_FID, type); in __open_id()
582 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT); in __open_id()
591 __open_id_set(fp, id, type); in __open_id()
597 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp) in ksmbd_open_durable_fd() argument
599 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID); in ksmbd_open_durable_fd()
600 return fp->persistent_id; in ksmbd_open_durable_fd()
605 struct ksmbd_file *fp; in ksmbd_open_fd() local
608 fp = kmem_cache_zalloc(filp_cache, GFP_KERNEL); in ksmbd_open_fd()
609 if (!fp) { in ksmbd_open_fd()
614 INIT_LIST_HEAD(&fp->blocked_works); in ksmbd_open_fd()
615 INIT_LIST_HEAD(&fp->node); in ksmbd_open_fd()
616 INIT_LIST_HEAD(&fp->lock_list); in ksmbd_open_fd()
617 spin_lock_init(&fp->f_lock); in ksmbd_open_fd()
618 atomic_set(&fp->refcount, 1); in ksmbd_open_fd()
620 fp->filp = filp; in ksmbd_open_fd()
621 fp->conn = work->conn; in ksmbd_open_fd()
622 fp->tcon = work->tcon; in ksmbd_open_fd()
623 fp->volatile_id = KSMBD_NO_FID; in ksmbd_open_fd()
624 fp->persistent_id = KSMBD_NO_FID; in ksmbd_open_fd()
625 fp->f_state = FP_NEW; in ksmbd_open_fd()
626 fp->f_ci = ksmbd_inode_get(fp); in ksmbd_open_fd()
628 if (!fp->f_ci) { in ksmbd_open_fd()
633 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_open_fd()
635 ksmbd_inode_put(fp->f_ci); in ksmbd_open_fd()
640 return fp; in ksmbd_open_fd()
643 kmem_cache_free(filp_cache, fp); in ksmbd_open_fd()
647 void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in ksmbd_update_fstate() argument
650 if (!fp) in ksmbd_update_fstate()
654 fp->f_state = state; in ksmbd_update_fstate()
662 struct ksmbd_file *fp)) in __close_file_table_ids() argument
665 struct ksmbd_file *fp; in __close_file_table_ids() local
668 idr_for_each_entry(ft->idr, fp, id) { in __close_file_table_ids()
669 if (skip(tcon, fp)) in __close_file_table_ids()
672 set_close_state_blocked_works(fp); in __close_file_table_ids()
674 if (!atomic_dec_and_test(&fp->refcount)) in __close_file_table_ids()
676 __ksmbd_close_fd(ft, fp); in __close_file_table_ids()
682 static inline bool is_reconnectable(struct ksmbd_file *fp) in is_reconnectable() argument
684 struct oplock_info *opinfo = opinfo_get(fp); in is_reconnectable()
695 if (fp->is_resilient || fp->is_persistent) in is_reconnectable()
697 else if (fp->is_durable && opinfo->is_lease && in is_reconnectable()
701 else if (fp->is_durable && opinfo->level == SMB2_OPLOCK_LEVEL_BATCH) in is_reconnectable()
709 struct ksmbd_file *fp) in tree_conn_fd_check() argument
711 return fp->tcon != tcon; in tree_conn_fd_check()
735 struct ksmbd_file *fp; in ksmbd_scavenger_dispose_dh() local
737 fp = list_first_entry(head, struct ksmbd_file, node); in ksmbd_scavenger_dispose_dh()
738 list_del_init(&fp->node); in ksmbd_scavenger_dispose_dh()
739 __ksmbd_close_fd(NULL, fp); in ksmbd_scavenger_dispose_dh()
745 struct ksmbd_file *fp = NULL; in ksmbd_durable_scavenger() local
770 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_durable_scavenger()
771 if (!fp->durable_timeout) in ksmbd_durable_scavenger()
774 if (atomic_read(&fp->refcount) > 1 || in ksmbd_durable_scavenger()
775 fp->conn) in ksmbd_durable_scavenger()
779 if (fp->durable_scavenger_timeout <= in ksmbd_durable_scavenger()
781 __ksmbd_remove_durable_fd(fp); in ksmbd_durable_scavenger()
782 list_add(&fp->node, &scavenger_list); in ksmbd_durable_scavenger()
787 fp->durable_scavenger_timeout - in ksmbd_durable_scavenger()
851 struct ksmbd_file *fp) in session_fd_check() argument
857 if (!is_reconnectable(fp)) in session_fd_check()
860 conn = fp->conn; in session_fd_check()
861 ci = fp->f_ci; in session_fd_check()
872 fp->conn = NULL; in session_fd_check()
873 fp->tcon = NULL; in session_fd_check()
874 fp->volatile_id = KSMBD_NO_FID; in session_fd_check()
876 if (fp->durable_timeout) in session_fd_check()
877 fp->durable_scavenger_timeout = in session_fd_check()
878 jiffies_to_msecs(jiffies) + fp->durable_timeout; in session_fd_check()
908 struct ksmbd_file *fp = NULL; in ksmbd_free_global_file_table() local
911 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_free_global_file_table()
912 ksmbd_remove_durable_fd(fp); in ksmbd_free_global_file_table()
913 __ksmbd_close_fd(NULL, fp); in ksmbd_free_global_file_table()
921 struct ksmbd_file *fp, char *name) in ksmbd_validate_name_reconnect() argument
930 ab_pathname = d_path(&fp->filp->f_path, pathname, PATH_MAX); in ksmbd_validate_name_reconnect()
946 int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_reopen_durable_fd() argument
951 if (!fp->is_durable || fp->conn || fp->tcon) { in ksmbd_reopen_durable_fd()
952 pr_err("Invalid durable fd [%p:%p]\n", fp->conn, fp->tcon); in ksmbd_reopen_durable_fd()
956 if (has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
957 pr_err("Still in use durable fd: %llu\n", fp->volatile_id); in ksmbd_reopen_durable_fd()
961 fp->conn = work->conn; in ksmbd_reopen_durable_fd()
962 fp->tcon = work->tcon; in ksmbd_reopen_durable_fd()
964 ci = fp->f_ci; in ksmbd_reopen_durable_fd()
969 op->conn = fp->conn; in ksmbd_reopen_durable_fd()
974 fp->f_state = FP_NEW; in ksmbd_reopen_durable_fd()
975 __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_reopen_durable_fd()
976 if (!has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
977 fp->conn = NULL; in ksmbd_reopen_durable_fd()
978 fp->tcon = NULL; in ksmbd_reopen_durable_fd()