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 | S_DEL_ON_CLS)); 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
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()
276 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp) in __ksmbd_remove_durable_fd() argument
278 if (!has_file_id(fp->persistent_id)) in __ksmbd_remove_durable_fd()
282 idr_remove(global_ft.idr, fp->persistent_id); in __ksmbd_remove_durable_fd()
286 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_remove_fd() argument
288 if (!has_file_id(fp->volatile_id)) in __ksmbd_remove_fd()
291 write_lock(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
292 list_del_init(&fp->node); in __ksmbd_remove_fd()
293 write_unlock(&fp->f_ci->m_lock); in __ksmbd_remove_fd()
296 idr_remove(ft->idr, fp->volatile_id); in __ksmbd_remove_fd()
300 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp) in __ksmbd_close_fd() argument
306 __ksmbd_remove_durable_fd(fp); in __ksmbd_close_fd()
307 __ksmbd_remove_fd(ft, fp); in __ksmbd_close_fd()
309 close_id_del_oplock(fp); in __ksmbd_close_fd()
310 filp = fp->filp; in __ksmbd_close_fd()
312 __ksmbd_inode_close(fp); in __ksmbd_close_fd()
319 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) { in __ksmbd_close_fd()
320 spin_lock(&fp->conn->llist_lock); in __ksmbd_close_fd()
322 spin_unlock(&fp->conn->llist_lock); in __ksmbd_close_fd()
329 if (ksmbd_stream_fd(fp)) in __ksmbd_close_fd()
330 kfree(fp->stream.name); in __ksmbd_close_fd()
331 kmem_cache_free(filp_cache, fp); in __ksmbd_close_fd()
334 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp) in ksmbd_fp_get() argument
336 if (fp->f_state != FP_INITED) in ksmbd_fp_get()
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 (fp->f_state != FP_INITED) in ksmbd_close_fd()
394 fp = NULL; in ksmbd_close_fd()
396 fp->f_state = FP_CLOSED; in ksmbd_close_fd()
397 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_close_fd()
398 fp = NULL; in ksmbd_close_fd()
403 if (!fp) in ksmbd_close_fd()
406 __put_fd_final(work, fp); in ksmbd_close_fd()
410 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp) in ksmbd_fd_put() argument
412 if (!fp) in ksmbd_fd_put()
415 if (!atomic_dec_and_test(&fp->refcount)) in ksmbd_fd_put()
417 __put_fd_final(work, fp); in ksmbd_fd_put()
420 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp) in __sanity_check() argument
422 if (!fp) in __sanity_check()
424 if (fp->tcon != tcon) in __sanity_check()
436 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_fast() local
438 if (__sanity_check(work->tcon, fp)) in ksmbd_lookup_fd_fast()
439 return fp; in ksmbd_lookup_fd_fast()
441 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_fast()
448 struct ksmbd_file *fp; in ksmbd_lookup_fd_slow() local
455 fp = __ksmbd_lookup_fd(&work->sess->file_table, id); in ksmbd_lookup_fd_slow()
456 if (!__sanity_check(work->tcon, fp)) { in ksmbd_lookup_fd_slow()
457 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
460 if (fp->persistent_id != pid) { in ksmbd_lookup_fd_slow()
461 ksmbd_fd_put(work, fp); in ksmbd_lookup_fd_slow()
464 return fp; in ksmbd_lookup_fd_slow()
474 struct ksmbd_file *fp = NULL; in ksmbd_lookup_fd_cguid() local
478 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_lookup_fd_cguid()
479 if (!memcmp(fp->create_guid, in ksmbd_lookup_fd_cguid()
482 fp = ksmbd_fp_get(fp); in ksmbd_lookup_fd_cguid()
488 return fp; in ksmbd_lookup_fd_cguid()
517 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type) in __open_id_set() argument
520 fp->volatile_id = id; in __open_id_set()
522 fp->persistent_id = id; in __open_id_set()
525 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in __open_id() argument
532 __open_id_set(fp, KSMBD_NO_FID, type); in __open_id()
538 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT); in __open_id()
547 __open_id_set(fp, id, type); in __open_id()
553 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp) in ksmbd_open_durable_fd() argument
555 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID); in ksmbd_open_durable_fd()
556 return fp->persistent_id; in ksmbd_open_durable_fd()
561 struct ksmbd_file *fp; in ksmbd_open_fd() local
564 fp = kmem_cache_zalloc(filp_cache, GFP_KERNEL); in ksmbd_open_fd()
565 if (!fp) { in ksmbd_open_fd()
570 INIT_LIST_HEAD(&fp->blocked_works); in ksmbd_open_fd()
571 INIT_LIST_HEAD(&fp->node); in ksmbd_open_fd()
572 INIT_LIST_HEAD(&fp->lock_list); in ksmbd_open_fd()
573 spin_lock_init(&fp->f_lock); in ksmbd_open_fd()
574 atomic_set(&fp->refcount, 1); in ksmbd_open_fd()
576 fp->filp = filp; in ksmbd_open_fd()
577 fp->conn = work->conn; in ksmbd_open_fd()
578 fp->tcon = work->tcon; in ksmbd_open_fd()
579 fp->volatile_id = KSMBD_NO_FID; in ksmbd_open_fd()
580 fp->persistent_id = KSMBD_NO_FID; in ksmbd_open_fd()
581 fp->f_state = FP_NEW; in ksmbd_open_fd()
582 fp->f_ci = ksmbd_inode_get(fp); in ksmbd_open_fd()
584 if (!fp->f_ci) { in ksmbd_open_fd()
589 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID); in ksmbd_open_fd()
591 ksmbd_inode_put(fp->f_ci); in ksmbd_open_fd()
596 return fp; in ksmbd_open_fd()
599 kmem_cache_free(filp_cache, fp); in ksmbd_open_fd()
603 void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp, in ksmbd_update_fstate() argument
606 if (!fp) in ksmbd_update_fstate()
610 fp->f_state = state; in ksmbd_update_fstate()
618 struct ksmbd_file *fp)) in __close_file_table_ids() argument
621 struct ksmbd_file *fp; in __close_file_table_ids() local
624 idr_for_each_entry(ft->idr, fp, id) { in __close_file_table_ids()
625 if (skip(tcon, fp)) in __close_file_table_ids()
628 set_close_state_blocked_works(fp); in __close_file_table_ids()
630 if (!atomic_dec_and_test(&fp->refcount)) in __close_file_table_ids()
632 __ksmbd_close_fd(ft, fp); in __close_file_table_ids()
639 struct ksmbd_file *fp) in tree_conn_fd_check() argument
641 return fp->tcon != tcon; in tree_conn_fd_check()
645 struct ksmbd_file *fp) in session_fd_check() argument
675 struct ksmbd_file *fp = NULL; in ksmbd_free_global_file_table() local
678 idr_for_each_entry(global_ft.idr, fp, id) { in ksmbd_free_global_file_table()
679 __ksmbd_remove_durable_fd(fp); in ksmbd_free_global_file_table()
680 kmem_cache_free(filp_cache, fp); in ksmbd_free_global_file_table()