vfs_cache.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright (C) 2019 Samsung Electronics Co., Ltd.
  4. */
  5. #ifndef __VFS_CACHE_H__
  6. #define __VFS_CACHE_H__
  7. #include <linux/file.h>
  8. #include <linux/fs.h>
  9. #include <linux/rwsem.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/idr.h>
  12. #include <linux/workqueue.h>
  13. #include "vfs.h"
  14. #include "mgmt/share_config.h"
  15. /* Windows style file permissions for extended response */
  16. #define FILE_GENERIC_ALL 0x1F01FF
  17. #define FILE_GENERIC_READ 0x120089
  18. #define FILE_GENERIC_WRITE 0x120116
  19. #define FILE_GENERIC_EXECUTE 0X1200a0
  20. #define KSMBD_START_FID 0
  21. #define KSMBD_NO_FID (INT_MAX)
  22. #define SMB2_NO_FID (0xFFFFFFFFFFFFFFFFULL)
  23. struct ksmbd_conn;
  24. struct ksmbd_session;
  25. struct ksmbd_lock {
  26. struct file_lock *fl;
  27. struct list_head clist;
  28. struct list_head flist;
  29. struct list_head llist;
  30. unsigned int flags;
  31. int cmd;
  32. int zero_len;
  33. unsigned long long start;
  34. unsigned long long end;
  35. };
  36. struct stream {
  37. char *name;
  38. ssize_t size;
  39. };
  40. struct ksmbd_inode {
  41. struct rw_semaphore m_lock;
  42. atomic_t m_count;
  43. atomic_t op_count;
  44. /* opinfo count for streams */
  45. atomic_t sop_count;
  46. struct dentry *m_de;
  47. unsigned int m_flags;
  48. struct hlist_node m_hash;
  49. struct list_head m_fp_list;
  50. struct list_head m_op_list;
  51. struct oplock_info *m_opinfo;
  52. __le32 m_fattr;
  53. };
  54. enum {
  55. FP_NEW = 0,
  56. FP_INITED,
  57. FP_CLOSED
  58. };
  59. struct ksmbd_file {
  60. struct file *filp;
  61. u64 persistent_id;
  62. u64 volatile_id;
  63. spinlock_t f_lock;
  64. struct ksmbd_inode *f_ci;
  65. struct ksmbd_inode *f_parent_ci;
  66. struct oplock_info __rcu *f_opinfo;
  67. struct ksmbd_conn *conn;
  68. struct ksmbd_tree_connect *tcon;
  69. atomic_t refcount;
  70. __le32 daccess;
  71. __le32 saccess;
  72. __le32 coption;
  73. __le32 cdoption;
  74. __u64 create_time;
  75. __u64 itime;
  76. bool is_nt_open;
  77. bool attrib_only;
  78. char client_guid[16];
  79. char create_guid[16];
  80. char app_instance_id[16];
  81. struct stream stream;
  82. struct list_head node;
  83. struct list_head blocked_works;
  84. struct list_head lock_list;
  85. unsigned int durable_timeout;
  86. unsigned int durable_scavenger_timeout;
  87. /* if ls is happening on directory, below is valid*/
  88. struct ksmbd_readdir_data readdir_data;
  89. int dot_dotdot[2];
  90. unsigned int f_state;
  91. bool reserve_lease_break;
  92. bool is_durable;
  93. bool is_persistent;
  94. bool is_resilient;
  95. };
  96. static inline void set_ctx_actor(struct dir_context *ctx,
  97. filldir_t actor)
  98. {
  99. ctx->actor = actor;
  100. }
  101. #define KSMBD_NR_OPEN_DEFAULT BITS_PER_LONG
  102. struct ksmbd_file_table {
  103. rwlock_t lock;
  104. struct idr *idr;
  105. };
  106. static inline bool has_file_id(u64 id)
  107. {
  108. return id < KSMBD_NO_FID;
  109. }
  110. static inline bool ksmbd_stream_fd(struct ksmbd_file *fp)
  111. {
  112. return fp->stream.name != NULL;
  113. }
  114. int ksmbd_init_file_table(struct ksmbd_file_table *ft);
  115. void ksmbd_destroy_file_table(struct ksmbd_file_table *ft);
  116. int ksmbd_close_fd(struct ksmbd_work *work, u64 id);
  117. struct ksmbd_file *ksmbd_lookup_fd_fast(struct ksmbd_work *work, u64 id);
  118. struct ksmbd_file *ksmbd_lookup_foreign_fd(struct ksmbd_work *work, u64 id);
  119. struct ksmbd_file *ksmbd_lookup_fd_slow(struct ksmbd_work *work, u64 id,
  120. u64 pid);
  121. void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp);
  122. struct ksmbd_inode *ksmbd_inode_lookup_lock(struct dentry *d);
  123. void ksmbd_inode_put(struct ksmbd_inode *ci);
  124. struct ksmbd_file *ksmbd_lookup_global_fd(unsigned long long id);
  125. struct ksmbd_file *ksmbd_lookup_durable_fd(unsigned long long id);
  126. void ksmbd_put_durable_fd(struct ksmbd_file *fp);
  127. struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
  128. struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry);
  129. unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
  130. struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
  131. void ksmbd_launch_ksmbd_durable_scavenger(void);
  132. void ksmbd_stop_durable_scavenger(void);
  133. void ksmbd_close_tree_conn_fds(struct ksmbd_work *work);
  134. void ksmbd_close_session_fds(struct ksmbd_work *work);
  135. int ksmbd_close_inode_fds(struct ksmbd_work *work, struct inode *inode);
  136. int ksmbd_init_global_file_table(void);
  137. void ksmbd_free_global_file_table(void);
  138. void ksmbd_set_fd_limit(unsigned long limit);
  139. void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
  140. unsigned int state);
  141. /*
  142. * INODE hash
  143. */
  144. int __init ksmbd_inode_hash_init(void);
  145. void ksmbd_release_inode_hash(void);
  146. enum KSMBD_INODE_STATUS {
  147. KSMBD_INODE_STATUS_OK,
  148. KSMBD_INODE_STATUS_UNKNOWN,
  149. KSMBD_INODE_STATUS_PENDING_DELETE,
  150. };
  151. int ksmbd_query_inode_status(struct dentry *dentry);
  152. bool ksmbd_inode_pending_delete(struct ksmbd_file *fp);
  153. void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp);
  154. void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp);
  155. void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp,
  156. int file_info);
  157. int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp);
  158. int ksmbd_validate_name_reconnect(struct ksmbd_share_config *share,
  159. struct ksmbd_file *fp, char *name);
  160. int ksmbd_init_file_cache(void);
  161. void ksmbd_exit_file_cache(void);
  162. #endif /* __VFS_CACHE_H__ */