Lines Matching refs:fp

85 static struct ksmbd_inode *ksmbd_inode_lookup(struct ksmbd_file *fp)  in ksmbd_inode_lookup()  argument
87 return __ksmbd_inode_lookup(fp->filp->f_path.dentry); in ksmbd_inode_lookup()
118 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_inode_pending_delete() argument
120 return (fp->f_ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS)); in ksmbd_inode_pending_delete()
123 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_set_inode_pending_delete() argument
125 fp->f_ci->m_flags |= S_DEL_PENDING; in ksmbd_set_inode_pending_delete()
128 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_clear_inode_pending_delete() argument
130 fp->f_ci->m_flags &= ~S_DEL_PENDING; in ksmbd_clear_inode_pending_delete()
133 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, in ksmbd_fd_set_delete_on_close() argument
136 if (ksmbd_stream_fd(fp)) { in ksmbd_fd_set_delete_on_close()
137 fp->f_ci->m_flags |= S_DEL_ON_CLS_STREAM; in ksmbd_fd_set_delete_on_close()
141 fp->f_ci->m_flags |= S_DEL_ON_CLS; in ksmbd_fd_set_delete_on_close()
159 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp) in ksmbd_inode_init() argument
169 ci->m_de = fp->filp->f_path.dentry; in ksmbd_inode_init()
173 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp) in ksmbd_inode_get() argument
179 ci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
188 rc = ksmbd_inode_init(ci, fp); in ksmbd_inode_get()
196 tmpci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
246 static void __ksmbd_inode_close(struct ksmbd_file *fp) in __ksmbd_inode_close() argument
248 struct ksmbd_inode *ci = fp->f_ci; in __ksmbd_inode_close()
252 filp = fp->filp; in __ksmbd_inode_close()
253 if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) { in __ksmbd_inode_close()
257 fp->stream.name, in __ksmbd_inode_close()
261 fp->stream.name); in __ksmbd_inode_close()
278 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp) in __ksmbd_remove_durable_fd() argument
280 if (!has_file_id(fp->persistent_id)) in __ksmbd_remove_durable_fd()
284 idr_remove(global_ft.idr, fp->persistent_id); in __ksmbd_remove_durable_fd()
288 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_remove_fd() argument
290 if (!has_file_id(fp->volatile_id)) in __ksmbd_remove_fd()
293 down_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
294 list_del_init(&fp->node); in __ksmbd_remove_fd()
295 up_write(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
298 idr_remove(ft->idr, fp->volatile_id); in __ksmbd_remove_fd()
302 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_close_fd() argument
308 __ksmbd_remove_durable_fd(fp); in __ksmbd_close_fd()
310 __ksmbd_remove_fd(ft, fp); in __ksmbd_close_fd()
312 close_id_del_oplock(fp); in __ksmbd_close_fd()
313 filp = fp->filp; in __ksmbd_close_fd()
315 __ksmbd_inode_close(fp); in __ksmbd_close_fd()
322 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in __ksmbd_close_fd()
323 spin_lock(&fp->conn->llist_lock); in __ksmbd_close_fd()
325 spin_unlock(&fp->conn->llist_lock); in __ksmbd_close_fd()
332 if (ksmbd_stream_fd(fp)) in __ksmbd_close_fd()
333 kfree(fp->stream.name); in __ksmbd_close_fd()
334 kmem_cache_free(filp_cache, fp); in __ksmbd_close_fd()
337 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp) in ksmbd_fp_get() argument
339 if (fp->f_state != FP_INITED) in ksmbd_fp_get()
342 if (!atomic_inc_not_zero(&fp->refcount)) in ksmbd_fp_get()
344 return fp; in ksmbd_fp_get()
350 struct ksmbd_file *fp; in __ksmbd_lookup_fd() local
356 fp = idr_find(ft->idr, id); in __ksmbd_lookup_fd()
357 if (fp) in __ksmbd_lookup_fd()
358 fp = ksmbd_fp_get(fp); in __ksmbd_lookup_fd()
360 return fp; in __ksmbd_lookup_fd()
363 static void __put_fd_final(struct ksmbd_work *work, struct ksmbd_file *fp) in __put_fd_final() argument
365 __ksmbd_close_fd(&work->sess->file_table, fp); in __put_fd_final()
369 static void set_close_state_blocked_works(struct ksmbd_file *fp) in set_close_state_blocked_works() argument
373 spin_lock(&fp->f_lock); in set_close_state_blocked_works()
374 list_for_each_entry(cancel_work, &fp->blocked_works, in set_close_state_blocked_works()
379 spin_unlock(&fp->f_lock); in set_close_state_blocked_works()
384 struct ksmbd_file *fp; in ksmbd_close_fd() local
392 fp = idr_find(ft->idr, id); in ksmbd_close_fd()
393 if (fp) { in ksmbd_close_fd()
394 set_close_state_blocked_works(fp); in ksmbd_close_fd()
396 if (fp->f_state != FP_INITED) in ksmbd_close_fd()
397 fp = NULL; in ksmbd_close_fd()
399 fp->f_state = FP_CLOSED; in ksmbd_close_fd()
400 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
401 fp = NULL; in ksmbd_close_fd()
406 if (!fp) in ksmbd_close_fd()
409 __put_fd_final(work, fp); in ksmbd_close_fd()
413 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
415 if (!fp) in ksmbd_fd_put()
418 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
420 __put_fd_final(work, fp); in ksmbd_fd_put()
423 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
425 if (!fp) in __sanity_check()
427 if (fp->tcon != tcon) in __sanity_check()
439 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
441 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
442 return fp; in ksmbd_lookup_fd_fast()
444 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
451 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
458 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
459 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
460 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
463 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
464 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
467 return fp; in ksmbd_lookup_fd_slow()
477 struct ksmbd_file *fp; in ksmbd_lookup_durable_fd() local
479 fp = __ksmbd_lookup_fd(&global_ft, id); in ksmbd_lookup_durable_fd()
480 if (fp && fp->conn) { in ksmbd_lookup_durable_fd()
481 ksmbd_put_durable_fd(fp); in ksmbd_lookup_durable_fd()
482 fp = NULL; in ksmbd_lookup_durable_fd()
485 return fp; in ksmbd_lookup_durable_fd()
488 void ksmbd_put_durable_fd(struct ksmbd_file *fp) in ksmbd_put_durable_fd() argument
490 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_put_durable_fd()
493 __ksmbd_close_fd(NULL, fp); in ksmbd_put_durable_fd()
498 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
502 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
503 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
506 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
512 return fp; in ksmbd_lookup_fd_cguid()
544 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type) in __open_id_set() argument
547 fp->volatile_id = id; in __open_id_set()
549 fp->persistent_id = id; in __open_id_set()
552 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in __open_id() argument
559 __open_id_set(fp, KSMBD_NO_FID, type); in __open_id()
565 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT); in __open_id()
574 __open_id_set(fp, id, type); in __open_id()
580 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp) in ksmbd_open_durable_fd() argument
582 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID); in ksmbd_open_durable_fd()
583 return fp->persistent_id; in ksmbd_open_durable_fd()
588 struct ksmbd_file *fp; in ksmbd_open_fd() local
591 fp = kmem_cache_zalloc(filp_cache, GFP_KERNEL); in ksmbd_open_fd()
592 if (!fp) { in ksmbd_open_fd()
597 INIT_LIST_HEAD(&fp->blocked_works); in ksmbd_open_fd()
598 INIT_LIST_HEAD(&fp->node); in ksmbd_open_fd()
599 INIT_LIST_HEAD(&fp->lock_list); in ksmbd_open_fd()
600 spin_lock_init(&fp->f_lock); in ksmbd_open_fd()
601 atomic_set(&fp->refcount, 1); in ksmbd_open_fd()
603 fp->filp = filp; in ksmbd_open_fd()
604 fp->conn = work->conn; in ksmbd_open_fd()
605 fp->tcon = work->tcon; in ksmbd_open_fd()
606 fp->volatile_id = KSMBD_NO_FID; in ksmbd_open_fd()
607 fp->persistent_id = KSMBD_NO_FID; in ksmbd_open_fd()
608 fp->f_state = FP_NEW; in ksmbd_open_fd()
609 fp->f_ci = ksmbd_inode_get(fp); in ksmbd_open_fd()
611 if (!fp->f_ci) { in ksmbd_open_fd()
616 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_open_fd()
618 ksmbd_inode_put(fp->f_ci); in ksmbd_open_fd()
623 return fp; in ksmbd_open_fd()
626 kmem_cache_free(filp_cache, fp); in ksmbd_open_fd()
630 void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in ksmbd_update_fstate() argument
633 if (!fp) in ksmbd_update_fstate()
637 fp->f_state = state; in ksmbd_update_fstate()
645 struct ksmbd_file *fp)) in __close_file_table_ids() argument
648 struct ksmbd_file *fp; in __close_file_table_ids() local
651 idr_for_each_entry(ft->idr, fp, id) { in __close_file_table_ids()
652 if (skip(tcon, fp)) in __close_file_table_ids()
655 set_close_state_blocked_works(fp); in __close_file_table_ids()
657 if (!atomic_dec_and_test(&fp->refcount)) in __close_file_table_ids()
659 __ksmbd_close_fd(ft, fp); in __close_file_table_ids()
665 static inline bool is_reconnectable(struct ksmbd_file *fp) in is_reconnectable() argument
667 struct oplock_info *opinfo = opinfo_get(fp); in is_reconnectable()
678 if (fp->is_resilient || fp->is_persistent) in is_reconnectable()
680 else if (fp->is_durable && opinfo->is_lease && in is_reconnectable()
684 else if (fp->is_durable && opinfo->level == SMB2_OPLOCK_LEVEL_BATCH) in is_reconnectable()
692 struct ksmbd_file *fp) in tree_conn_fd_check() argument
694 return fp->tcon != tcon; in tree_conn_fd_check()
698 struct ksmbd_file *fp) in session_fd_check() argument
704 if (!is_reconnectable(fp)) in session_fd_check()
707 conn = fp->conn; in session_fd_check()
708 ci = fp->f_ci; in session_fd_check()
717 fp->conn = NULL; in session_fd_check()
718 fp->tcon = NULL; in session_fd_check()
719 fp->volatile_id = KSMBD_NO_FID; in session_fd_check()
749 struct ksmbd_file *fp = NULL; in ksmbd_free_global_file_table() local
752 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_free_global_file_table()
753 __ksmbd_remove_durable_fd(fp); in ksmbd_free_global_file_table()
754 kmem_cache_free(filp_cache, fp); in ksmbd_free_global_file_table()
761 struct ksmbd_file *fp, char *name) in ksmbd_validate_name_reconnect() argument
770 ab_pathname = d_path(&fp->filp->f_path, pathname, PATH_MAX); in ksmbd_validate_name_reconnect()
786 int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_reopen_durable_fd() argument
791 if (!fp->is_durable || fp->conn || fp->tcon) { in ksmbd_reopen_durable_fd()
792 pr_err("Invalid durable fd [%p:%p]\n", fp->conn, fp->tcon); in ksmbd_reopen_durable_fd()
796 if (has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
797 pr_err("Still in use durable fd: %llu\n", fp->volatile_id); in ksmbd_reopen_durable_fd()
801 fp->conn = work->conn; in ksmbd_reopen_durable_fd()
802 fp->tcon = work->tcon; in ksmbd_reopen_durable_fd()
804 ci = fp->f_ci; in ksmbd_reopen_durable_fd()
809 op->conn = fp->conn; in ksmbd_reopen_durable_fd()
813 __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_reopen_durable_fd()
814 if (!has_file_id(fp->volatile_id)) { in ksmbd_reopen_durable_fd()
815 fp->conn = NULL; in ksmbd_reopen_durable_fd()
816 fp->tcon = NULL; in ksmbd_reopen_durable_fd()