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(file_inode(fp->filp)); in ksmbd_inode_lookup()
117 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_inode_pending_delete() argument
119 return (fp->f_ci->m_flags & S_DEL_PENDING); in ksmbd_inode_pending_delete()
122 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_set_inode_pending_delete() argument
124 fp->f_ci->m_flags |= S_DEL_PENDING; in ksmbd_set_inode_pending_delete()
127 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_clear_inode_pending_delete() argument
129 fp->f_ci->m_flags &= ~S_DEL_PENDING; in ksmbd_clear_inode_pending_delete()
132 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, in ksmbd_fd_set_delete_on_close() argument
135 if (ksmbd_stream_fd(fp)) { in ksmbd_fd_set_delete_on_close()
136 fp->f_ci->m_flags |= S_DEL_ON_CLS_STREAM; in ksmbd_fd_set_delete_on_close()
140 fp->f_ci->m_flags |= S_DEL_ON_CLS; in ksmbd_fd_set_delete_on_close()
158 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp) in ksmbd_inode_init() argument
160 ci->m_inode = file_inode(fp->filp); in ksmbd_inode_init()
172 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp) in ksmbd_inode_get() argument
178 ci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
187 rc = ksmbd_inode_init(ci, fp); in ksmbd_inode_get()
195 tmpci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
245 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()
260 fp->stream.name); in __ksmbd_inode_close()
279 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp) in __ksmbd_remove_durable_fd() argument
281 if (!has_file_id(fp->persistent_id)) in __ksmbd_remove_durable_fd()
285 idr_remove(global_ft.idr, fp->persistent_id); in __ksmbd_remove_durable_fd()
289 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_remove_fd() argument
291 if (!has_file_id(fp->volatile_id)) in __ksmbd_remove_fd()
294 write_lock(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
295 list_del_init(&fp->node); in __ksmbd_remove_fd()
296 write_unlock(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
299 idr_remove(ft->idr, fp->volatile_id); in __ksmbd_remove_fd()
303 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_close_fd() argument
309 __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 (!atomic_inc_not_zero(&fp->refcount)) in ksmbd_fp_get()
341 return fp; in ksmbd_fp_get()
347 struct ksmbd_file *fp; in __ksmbd_lookup_fd() local
353 fp = idr_find(ft->idr, id); in __ksmbd_lookup_fd()
354 if (fp) in __ksmbd_lookup_fd()
355 fp = ksmbd_fp_get(fp); in __ksmbd_lookup_fd()
357 return fp; in __ksmbd_lookup_fd()
360 static void __put_fd_final(struct ksmbd_work *work, struct ksmbd_file *fp) in __put_fd_final() argument
362 __ksmbd_close_fd(&work->sess->file_table, fp); in __put_fd_final()
366 static void set_close_state_blocked_works(struct ksmbd_file *fp) in set_close_state_blocked_works() argument
370 spin_lock(&fp->f_lock); in set_close_state_blocked_works()
371 list_for_each_entry(cancel_work, &fp->blocked_works, in set_close_state_blocked_works()
376 spin_unlock(&fp->f_lock); in set_close_state_blocked_works()
381 struct ksmbd_file *fp; in ksmbd_close_fd() local
389 fp = idr_find(ft->idr, id); in ksmbd_close_fd()
390 if (fp) { in ksmbd_close_fd()
391 set_close_state_blocked_works(fp); in ksmbd_close_fd()
393 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
394 fp = NULL; in ksmbd_close_fd()
398 if (!fp) in ksmbd_close_fd()
401 __put_fd_final(work, fp); in ksmbd_close_fd()
405 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
407 if (!fp) in ksmbd_fd_put()
410 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
412 __put_fd_final(work, fp); in ksmbd_fd_put()
415 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
417 if (!fp) in __sanity_check()
419 if (fp->tcon != tcon) in __sanity_check()
431 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
433 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
434 return fp; in ksmbd_lookup_fd_fast()
436 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
443 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
450 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
451 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
452 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
455 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
456 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
459 return fp; in ksmbd_lookup_fd_slow()
469 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
473 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
474 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
477 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
483 return fp; in ksmbd_lookup_fd_cguid()
512 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type) in __open_id_set() argument
515 fp->volatile_id = id; in __open_id_set()
517 fp->persistent_id = id; in __open_id_set()
520 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in __open_id() argument
527 __open_id_set(fp, KSMBD_NO_FID, type); in __open_id()
533 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT); in __open_id()
542 __open_id_set(fp, id, type); in __open_id()
548 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp) in ksmbd_open_durable_fd() argument
550 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID); in ksmbd_open_durable_fd()
551 return fp->persistent_id; in ksmbd_open_durable_fd()
556 struct ksmbd_file *fp; in ksmbd_open_fd() local
559 fp = kmem_cache_zalloc(filp_cache, GFP_KERNEL); in ksmbd_open_fd()
560 if (!fp) { in ksmbd_open_fd()
565 INIT_LIST_HEAD(&fp->blocked_works); in ksmbd_open_fd()
566 INIT_LIST_HEAD(&fp->node); in ksmbd_open_fd()
567 INIT_LIST_HEAD(&fp->lock_list); in ksmbd_open_fd()
568 spin_lock_init(&fp->f_lock); in ksmbd_open_fd()
569 atomic_set(&fp->refcount, 1); in ksmbd_open_fd()
571 fp->filp = filp; in ksmbd_open_fd()
572 fp->conn = work->conn; in ksmbd_open_fd()
573 fp->tcon = work->tcon; in ksmbd_open_fd()
574 fp->volatile_id = KSMBD_NO_FID; in ksmbd_open_fd()
575 fp->persistent_id = KSMBD_NO_FID; in ksmbd_open_fd()
576 fp->f_ci = ksmbd_inode_get(fp); in ksmbd_open_fd()
578 if (!fp->f_ci) { in ksmbd_open_fd()
583 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_open_fd()
585 ksmbd_inode_put(fp->f_ci); in ksmbd_open_fd()
590 return fp; in ksmbd_open_fd()
593 kmem_cache_free(filp_cache, fp); in ksmbd_open_fd()
601 struct ksmbd_file *fp)) in __close_file_table_ids() argument
604 struct ksmbd_file *fp; in __close_file_table_ids() local
607 idr_for_each_entry(ft->idr, fp, id) { in __close_file_table_ids()
608 if (skip(tcon, fp)) in __close_file_table_ids()
611 set_close_state_blocked_works(fp); in __close_file_table_ids()
613 if (!atomic_dec_and_test(&fp->refcount)) in __close_file_table_ids()
615 __ksmbd_close_fd(ft, fp); in __close_file_table_ids()
622 struct ksmbd_file *fp) in tree_conn_fd_check() argument
624 return fp->tcon != tcon; in tree_conn_fd_check()
628 struct ksmbd_file *fp) in session_fd_check() argument
658 struct ksmbd_file *fp = NULL; in ksmbd_free_global_file_table() local
661 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_free_global_file_table()
662 __ksmbd_remove_durable_fd(fp); in ksmbd_free_global_file_table()
663 kmem_cache_free(filp_cache, fp); in ksmbd_free_global_file_table()