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