Lines Matching refs:fp

85 static struct ksmbd_inode *ksmbd_inode_lookup(struct ksmbd_file *fp)
87 return __ksmbd_inode_lookup(fp->filp->f_path.dentry);
118 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp)
120 return (fp->f_ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS));
123 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp)
125 fp->f_ci->m_flags |= S_DEL_PENDING;
128 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp)
130 fp->f_ci->m_flags &= ~S_DEL_PENDING;
133 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp,
136 if (ksmbd_stream_fd(fp)) {
137 fp->f_ci->m_flags |= S_DEL_ON_CLS_STREAM;
141 fp->f_ci->m_flags |= S_DEL_ON_CLS;
159 static int ksmbd_inode_init(struct ksmbd_inode *ci, struct ksmbd_file *fp)
169 ci->m_de = fp->filp->f_path.dentry;
173 static struct ksmbd_inode *ksmbd_inode_get(struct ksmbd_file *fp)
179 ci = ksmbd_inode_lookup(fp);
188 rc = ksmbd_inode_init(ci, fp);
196 tmpci = ksmbd_inode_lookup(fp);
231 /* init master fp hash table */
246 static void __ksmbd_inode_close(struct ksmbd_file *fp)
248 struct ksmbd_inode *ci = fp->f_ci;
252 filp = fp->filp;
253 if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) {
257 fp->stream.name);
260 fp->stream.name);
277 static void __ksmbd_remove_durable_fd(struct ksmbd_file *fp)
279 if (!has_file_id(fp->persistent_id))
283 idr_remove(global_ft.idr, fp->persistent_id);
287 static void __ksmbd_remove_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp)
289 if (!has_file_id(fp->volatile_id))
292 write_lock(&fp->f_ci->m_lock);
293 list_del_init(&fp->node);
294 write_unlock(&fp->f_ci->m_lock);
297 idr_remove(ft->idr, fp->volatile_id);
301 static void __ksmbd_close_fd(struct ksmbd_file_table *ft, struct ksmbd_file *fp)
307 __ksmbd_remove_durable_fd(fp);
309 __ksmbd_remove_fd(ft, fp);
311 close_id_del_oplock(fp);
312 filp = fp->filp;
314 __ksmbd_inode_close(fp);
318 /* because the reference count of fp is 0, it is guaranteed that
319 * there are not accesses to fp->lock_list.
321 list_for_each_entry_safe(smb_lock, tmp_lock, &fp->lock_list, flist) {
322 spin_lock(&fp->conn->llist_lock);
324 spin_unlock(&fp->conn->llist_lock);
331 if (ksmbd_stream_fd(fp))
332 kfree(fp->stream.name);
333 kmem_cache_free(filp_cache, fp);
336 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp)
338 if (fp->f_state != FP_INITED)
341 if (!atomic_inc_not_zero(&fp->refcount))
343 return fp;
349 struct ksmbd_file *fp;
355 fp = idr_find(ft->idr, id);
356 if (fp)
357 fp = ksmbd_fp_get(fp);
359 return fp;
362 static void __put_fd_final(struct ksmbd_work *work, struct ksmbd_file *fp)
364 __ksmbd_close_fd(&work->sess->file_table, fp);
368 static void set_close_state_blocked_works(struct ksmbd_file *fp)
372 spin_lock(&fp->f_lock);
373 list_for_each_entry(cancel_work, &fp->blocked_works,
378 spin_unlock(&fp->f_lock);
383 struct ksmbd_file *fp;
391 fp = idr_find(ft->idr, id);
392 if (fp) {
393 set_close_state_blocked_works(fp);
395 if (fp->f_state != FP_INITED)
396 fp = NULL;
398 fp->f_state = FP_CLOSED;
399 if (!atomic_dec_and_test(&fp->refcount))
400 fp = NULL;
405 if (!fp)
408 __put_fd_final(work, fp);
412 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp)
414 if (!fp)
417 if (!atomic_dec_and_test(&fp->refcount))
419 __put_fd_final(work, fp);
422 static bool __sanity_check(struct ksmbd_tree_connect *tcon, struct ksmbd_file *fp)
424 if (!fp)
426 if (fp->tcon != tcon)
438 struct ksmbd_file *fp = __ksmbd_lookup_fd(&work->sess->file_table, id);
440 if (__sanity_check(work->tcon, fp))
441 return fp;
443 ksmbd_fd_put(work, fp);
450 struct ksmbd_file *fp;
457 fp = __ksmbd_lookup_fd(&work->sess->file_table, id);
458 if (!__sanity_check(work->tcon, fp)) {
459 ksmbd_fd_put(work, fp);
462 if (fp->persistent_id != pid) {
463 ksmbd_fd_put(work, fp);
466 return fp;
476 struct ksmbd_file *fp;
478 fp = __ksmbd_lookup_fd(&global_ft, id);
479 if (fp && fp->conn) {
480 ksmbd_put_durable_fd(fp);
481 fp = NULL;
484 return fp;
487 void ksmbd_put_durable_fd(struct ksmbd_file *fp)
489 if (!atomic_dec_and_test(&fp->refcount))
492 __ksmbd_close_fd(NULL, fp);
497 struct ksmbd_file *fp = NULL;
501 idr_for_each_entry(global_ft.idr, fp, id) {
502 if (!memcmp(fp->create_guid,
505 fp = ksmbd_fp_get(fp);
511 return fp;
543 static void __open_id_set(struct ksmbd_file *fp, u64 id, int type)
546 fp->volatile_id = id;
548 fp->persistent_id = id;
551 static int __open_id(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
558 __open_id_set(fp, KSMBD_NO_FID, type);
564 ret = idr_alloc_cyclic(ft->idr, fp, 0, INT_MAX - 1, GFP_NOWAIT);
573 __open_id_set(fp, id, type);
579 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp)
581 __open_id(&global_ft, fp, OPEN_ID_TYPE_PERSISTENT_ID);
582 return fp->persistent_id;
587 struct ksmbd_file *fp;
590 fp = kmem_cache_zalloc(filp_cache, GFP_KERNEL);
591 if (!fp) {
596 INIT_LIST_HEAD(&fp->blocked_works);
597 INIT_LIST_HEAD(&fp->node);
598 INIT_LIST_HEAD(&fp->lock_list);
599 spin_lock_init(&fp->f_lock);
600 atomic_set(&fp->refcount, 1);
602 fp->filp = filp;
603 fp->conn = work->conn;
604 fp->tcon = work->tcon;
605 fp->volatile_id = KSMBD_NO_FID;
606 fp->persistent_id = KSMBD_NO_FID;
607 fp->f_state = FP_NEW;
608 fp->f_ci = ksmbd_inode_get(fp);
610 if (!fp->f_ci) {
615 ret = __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID);
617 ksmbd_inode_put(fp->f_ci);
622 return fp;
625 kmem_cache_free(filp_cache, fp);
629 void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
632 if (!fp)
636 fp->f_state = state;
644 struct ksmbd_file *fp))
647 struct ksmbd_file *fp;
650 idr_for_each_entry(ft->idr, fp, id) {
651 if (skip(tcon, fp))
654 set_close_state_blocked_works(fp);
656 if (!atomic_dec_and_test(&fp->refcount))
658 __ksmbd_close_fd(ft, fp);
664 static inline bool is_reconnectable(struct ksmbd_file *fp)
666 struct oplock_info *opinfo = opinfo_get(fp);
677 if (fp->is_resilient || fp->is_persistent)
679 else if (fp->is_durable && opinfo->is_lease &&
683 else if (fp->is_durable && opinfo->level == SMB2_OPLOCK_LEVEL_BATCH)
691 struct ksmbd_file *fp)
693 return fp->tcon != tcon;
697 struct ksmbd_file *fp)
703 if (!is_reconnectable(fp))
706 conn = fp->conn;
707 ci = fp->f_ci;
716 fp->conn = NULL;
717 fp->tcon = NULL;
718 fp->volatile_id = KSMBD_NO_FID;
748 struct ksmbd_file *fp = NULL;
751 idr_for_each_entry(global_ft.idr, fp, id) {
752 __ksmbd_remove_durable_fd(fp);
753 kmem_cache_free(filp_cache, fp);
760 struct ksmbd_file *fp, char *name)
769 ab_pathname = d_path(&fp->filp->f_path, pathname, PATH_MAX);
785 int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp)
790 if (!fp->is_durable || fp->conn || fp->tcon) {
791 pr_err("Invalid durable fd [%p:%p]\n", fp->conn, fp->tcon);
795 if (has_file_id(fp->volatile_id)) {
796 pr_err("Still in use durable fd: %llu\n", fp->volatile_id);
800 fp->conn = work->conn;
801 fp->tcon = work->tcon;
803 ci = fp->f_ci;
808 op->conn = fp->conn;
812 __open_id(&work->sess->file_table, fp, OPEN_ID_TYPE_VOLATILE_ID);
813 if (!has_file_id(fp->volatile_id)) {
814 fp->conn = NULL;
815 fp->tcon = NULL;