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/mutex.h> 12 #include <linux/rwsem.h> 13 #include <linux/spinlock.h> 14 #include <linux/idr.h> 15 #include <linux/wait.h> 16 #include <linux/workqueue.h> 17 18 #include "vfs.h" 19 #include "mgmt/share_config.h" 20 21 /* Windows style file permissions for extended response */ 22 #define FILE_GENERIC_ALL 0x1F01FF 23 #define FILE_GENERIC_READ 0x120089 24 #define FILE_GENERIC_WRITE 0x120116 25 #define FILE_GENERIC_EXECUTE 0X1200a0 26 27 /* 28 * Start volatile/persistent file id allocation at 1. A file id of 0 yields an 29 * SMB2 FileId of {0, 0}, which clients (e.g. Windows, Samba) treat as a null 30 * handle and never close, leaking the open on the server. 31 */ 32 #define KSMBD_START_FID 1 33 #define KSMBD_NO_FID (INT_MAX) 34 #define SMB2_NO_FID (0xFFFFFFFFFFFFFFFFULL) 35 36 struct ksmbd_conn; 37 struct ksmbd_session; 38 struct ksmbd_file; 39 40 struct ksmbd_lock { 41 struct file_lock *fl; 42 struct hlist_node hlist; 43 struct list_head flist; 44 struct list_head llist; 45 unsigned int flags; 46 int cmd; 47 int zero_len; 48 bool virtual_lock; 49 bool vfs_locked; 50 bool pending; 51 unsigned long long start; 52 unsigned long long end; 53 }; 54 55 int ksmbd_file_lock_check(struct ksmbd_lock *lock); 56 void ksmbd_file_lock_add(struct ksmbd_file *fp, struct list_head *locks); 57 bool ksmbd_file_lock_conflict(struct ksmbd_lock *lock); 58 int ksmbd_file_lock_reserve(struct ksmbd_file *fp, struct ksmbd_lock *lock); 59 void ksmbd_file_lock_remove(struct ksmbd_lock *lock); 60 int ksmbd_file_lock_unlock(struct ksmbd_lock *lock); 61 extern wait_queue_head_t ksmbd_lock_wait; 62 63 struct stream { 64 char *name; 65 ssize_t size; 66 loff_t pos; 67 }; 68 69 struct ksmbd_inode { 70 struct rw_semaphore m_lock; 71 atomic_t m_count; 72 atomic_t op_count; 73 /* opinfo count for streams */ 74 atomic_t sop_count; 75 struct dentry *m_de; 76 unsigned int m_flags; 77 struct hlist_node m_hash; 78 struct list_head m_fp_list; 79 struct list_head m_op_list; 80 struct oplock_info *m_opinfo; 81 __le32 m_fattr; 82 }; 83 84 enum { 85 FP_NEW = 0, 86 FP_INITED, 87 FP_CLOSED 88 }; 89 90 /* Owner information for durable handle reconnect */ 91 struct durable_owner { 92 unsigned int uid; 93 unsigned int gid; 94 char *name; 95 }; 96 97 #define KSMBD_LOCK_SEQ_ARRAY_SIZE 64 98 99 struct ksmbd_lock_sequence { 100 bool valid; 101 u8 sequence; 102 }; 103 104 struct ksmbd_file { 105 struct file *filp; 106 u64 persistent_id; 107 u64 volatile_id; 108 u64 durable_volatile_id; 109 110 spinlock_t f_lock; 111 112 struct ksmbd_inode *f_ci; 113 struct ksmbd_inode *f_parent_ci; 114 struct oplock_info __rcu *f_opinfo; 115 struct ksmbd_conn *conn; 116 struct ksmbd_tree_connect *tcon; 117 /* Own a share reference independently of tcon; rebind under f_lock. */ 118 struct ksmbd_share_config *share_conf; 119 120 atomic_t refcount; 121 __le32 daccess; 122 __le32 saccess; 123 __le32 coption; 124 __le32 cdoption; 125 __le32 create_file_attributes; 126 __u64 create_time; 127 __u64 change_time; 128 __u64 allocation_size; 129 __u64 itime; 130 __u64 open_mtime; 131 132 bool is_nt_open; 133 bool attrib_only; 134 bool allocation_size_set; 135 136 char client_guid[16]; 137 char create_guid[16]; 138 char app_instance_id[16]; 139 140 struct stream stream; 141 struct list_head node; 142 struct list_head blocked_works; 143 struct list_head lock_list; 144 /* 145 * Per-handle FileDispositionInformation delete-pending state for a 146 * stream handle -- separate from ksmbd_inode's inode-wide m_flags, 147 * which have no way to record which stream on a multi-stream file 148 * was actually marked for deletion. See ksmbd_fd_set_delete_pending(). 149 */ 150 bool stream_del_pending; 151 152 unsigned int durable_timeout; 153 unsigned int durable_scavenger_timeout; 154 /* CREATE action returned when this durable handle was established. */ 155 __le32 create_action; 156 157 /* if ls is happening on directory, below is valid*/ 158 struct ksmbd_readdir_data readdir_data; 159 struct mutex readdir_lock; 160 int dot_dotdot[2]; 161 unsigned int f_state; 162 bool reserve_lease_break; 163 bool is_durable; 164 bool is_persistent; 165 bool is_resilient; 166 bool has_app_instance_id; 167 bool app_instance_version_valid; 168 u64 app_instance_version_high; 169 u64 app_instance_version_low; 170 bool durable_reconnect_disabled; 171 bool durable_replay_consumed; 172 173 bool is_posix_ctxt; 174 bool posix_append; 175 struct durable_owner owner; 176 __le16 channel_sequence; 177 unsigned int outstanding_requests; 178 unsigned int outstanding_pre_requests; 179 struct ksmbd_lock_sequence lock_seq[KSMBD_LOCK_SEQ_ARRAY_SIZE]; 180 }; 181 182 static inline void set_ctx_actor(struct dir_context *ctx, 183 filldir_t actor) 184 { 185 ctx->actor = actor; 186 } 187 188 #define KSMBD_NR_OPEN_DEFAULT BITS_PER_LONG 189 190 struct ksmbd_file_table { 191 rwlock_t lock; 192 struct idr *idr; 193 }; 194 195 static inline bool has_file_id(u64 id) 196 { 197 return id < KSMBD_NO_FID; 198 } 199 200 static inline bool ksmbd_stream_fd(struct ksmbd_file *fp) 201 { 202 return fp->stream.name != NULL; 203 } 204 205 int ksmbd_init_file_table(struct ksmbd_file_table *ft); 206 void ksmbd_destroy_file_table(struct ksmbd_session *sess); 207 int ksmbd_close_fd(struct ksmbd_work *work, u64 id); 208 struct ksmbd_file *ksmbd_lookup_fd_fast(struct ksmbd_work *work, u64 id); 209 struct ksmbd_file *ksmbd_lookup_foreign_fd(struct ksmbd_work *work, u64 id); 210 struct ksmbd_file *ksmbd_lookup_fd_slow(struct ksmbd_work *work, u64 id, 211 u64 pid); 212 int ksmbd_vfs_set_durable_owner(struct ksmbd_file *fp, 213 struct ksmbd_user *user); 214 struct ksmbd_file *ksmbd_file_get(struct ksmbd_file *fp); 215 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp); 216 struct ksmbd_inode *ksmbd_inode_lookup_lock(struct dentry *d); 217 void ksmbd_inode_put(struct ksmbd_inode *ci); 218 bool ksmbd_close_disconnected_durable_delete_on_close(struct dentry *dentry); 219 struct ksmbd_file *ksmbd_lookup_global_fd(unsigned long long id); 220 struct ksmbd_file *ksmbd_lookup_durable_fd(unsigned long long id); 221 void ksmbd_put_durable_fd(struct ksmbd_file *fp); 222 int ksmbd_invalidate_durable_fd(unsigned long long id); 223 bool ksmbd_has_other_active_fd(struct ksmbd_file *fp); 224 bool ksmbd_has_stream_without_delete_share(struct ksmbd_file *fp); 225 bool ksmbd_app_instance_id_matches(struct ksmbd_work *work, 226 struct ksmbd_file *fp); 227 struct ksmbd_file * 228 ksmbd_lookup_fd_app_instance_id_next(char *app_instance_id, int *cursor); 229 int ksmbd_close_fd_app_instance_id(struct ksmbd_work *work, 230 struct ksmbd_file *fp, bool *closed); 231 struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid); 232 struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry); 233 bool ksmbd_has_other_nonposix_open(struct dentry *dentry); 234 bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp); 235 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp); 236 struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp); 237 void ksmbd_launch_ksmbd_durable_scavenger(void); 238 void ksmbd_stop_durable_scavenger(void); 239 bool ksmbd_durable_scavenger_active(void); 240 void ksmbd_close_tree_conn_fds(struct ksmbd_work *work); 241 void ksmbd_close_session_fds(struct ksmbd_work *work); 242 void ksmbd_wake_session_blocked_works(struct ksmbd_session *sess); 243 int ksmbd_close_inode_fds(struct ksmbd_work *work, struct inode *inode); 244 int ksmbd_init_global_file_table(void); 245 void ksmbd_free_global_file_table(void); 246 void ksmbd_schedule_oplock_break_timer(unsigned long timeout); 247 void ksmbd_set_fd_limit(unsigned long limit); 248 int ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp, 249 unsigned int state); 250 bool ksmbd_vfs_compare_durable_owner(struct ksmbd_file *fp, 251 struct ksmbd_user *user); 252 253 /* 254 * INODE hash 255 */ 256 int __init ksmbd_inode_hash_init(void); 257 void ksmbd_release_inode_hash(void); 258 259 enum KSMBD_INODE_STATUS { 260 KSMBD_INODE_STATUS_OK, 261 KSMBD_INODE_STATUS_UNKNOWN, 262 KSMBD_INODE_STATUS_PENDING_DELETE, 263 }; 264 265 int ksmbd_query_inode_status(struct dentry *dentry); 266 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp); 267 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp); 268 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp); 269 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp, 270 int file_info); 271 void ksmbd_fd_set_delete_pending(struct ksmbd_file *fp); 272 void ksmbd_fd_clear_delete_pending(struct ksmbd_file *fp); 273 int ksmbd_reopen_durable_fd(struct ksmbd_work *work, struct ksmbd_file *fp); 274 int ksmbd_rebind_replay_fd(struct ksmbd_work *work, struct ksmbd_file *fp); 275 int ksmbd_validate_name_reconnect(struct ksmbd_share_config *share, 276 struct ksmbd_file *fp, char *name); 277 int ksmbd_init_file_cache(void); 278 void ksmbd_exit_file_cache(void); 279 #endif /* __VFS_CACHE_H__ */ 280