Lines Matching refs:fp

84 static struct ksmbd_inode *ksmbd_inode_lookup(struct ksmbd_file *fp)  in ksmbd_inode_lookup()  argument
86 return __ksmbd_inode_lookup(file_inode(fp->filp)); in ksmbd_inode_lookup()
116 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_inode_pending_delete() argument
118 return (fp->f_ci->m_flags & S_DEL_PENDING); in ksmbd_inode_pending_delete()
121 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_set_inode_pending_delete() argument
123 fp->f_ci->m_flags |= S_DEL_PENDING; in ksmbd_set_inode_pending_delete()
126 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp) in ksmbd_clear_inode_pending_delete() argument
128 fp->f_ci->m_flags &= ~S_DEL_PENDING; in ksmbd_clear_inode_pending_delete()
131 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, in ksmbd_fd_set_delete_on_close() argument
134 if (ksmbd_stream_fd(fp)) { in ksmbd_fd_set_delete_on_close()
135 fp->f_ci->m_flags |= S_DEL_ON_CLS_STREAM; in ksmbd_fd_set_delete_on_close()
139 fp->f_ci->m_flags |= S_DEL_ON_CLS; in ksmbd_fd_set_delete_on_close()
157 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp) in ksmbd_inode_init() argument
159 ci->m_inode = file_inode(fp->filp); in ksmbd_inode_init()
171 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp) in ksmbd_inode_get() argument
177 ci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
186 rc = ksmbd_inode_init(ci, fp); in ksmbd_inode_get()
194 tmpci = ksmbd_inode_lookup(fp); in ksmbd_inode_get()
244 static void __ksmbd_inode_close(struct ksmbd_file *fp) in __ksmbd_inode_close() argument
247 struct ksmbd_inode *ci = fp->f_ci; in __ksmbd_inode_close()
251 filp = fp->filp; in __ksmbd_inode_close()
252 if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) { in __ksmbd_inode_close()
256 fp->stream.name); in __ksmbd_inode_close()
259 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 write_lock(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
294 list_del_init(&fp->node); in __ksmbd_remove_fd()
295 write_unlock(&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()
309 __ksmbd_remove_fd(ft, fp); in __ksmbd_close_fd()
311 close_id_del_oplock(fp); in __ksmbd_close_fd()
312 filp = fp->filp; in __ksmbd_close_fd()
314 __ksmbd_inode_close(fp); in __ksmbd_close_fd()
321 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in __ksmbd_close_fd()
322 spin_lock(&fp->conn->llist_lock); in __ksmbd_close_fd()
324 spin_unlock(&fp->conn->llist_lock); in __ksmbd_close_fd()
331 kfree(fp->filename); 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_safe(cancel_work, ctmp, &fp->blocked_works, in set_close_state_blocked_works()
377 spin_unlock(&fp->f_lock); in set_close_state_blocked_works()
382 struct ksmbd_file *fp; in ksmbd_close_fd() local
390 fp = idr_find(ft->idr, id); in ksmbd_close_fd()
391 if (fp) { in ksmbd_close_fd()
392 set_close_state_blocked_works(fp); in ksmbd_close_fd()
394 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
395 fp = NULL; in ksmbd_close_fd()
399 if (!fp) in ksmbd_close_fd()
402 __put_fd_final(work, fp); in ksmbd_close_fd()
406 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
408 if (!fp) in ksmbd_fd_put()
411 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
413 __put_fd_final(work, fp); in ksmbd_fd_put()
416 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
418 if (!fp) in __sanity_check()
420 if (fp->tcon != tcon) in __sanity_check()
432 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
434 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
435 return fp; in ksmbd_lookup_fd_fast()
437 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
444 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
451 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
452 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
453 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
456 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
457 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
460 return fp; in ksmbd_lookup_fd_slow()
470 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
474 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
475 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
478 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
484 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->sess->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()