ksmbd: change data type of volatile/persistent id to u64
[linux-2.6-microblaze.git] / fs / ksmbd / vfs_cache.h
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
18 /* Windows style file permissions for extended response */
19 #define FILE_GENERIC_ALL        0x1F01FF
20 #define FILE_GENERIC_READ       0x120089
21 #define FILE_GENERIC_WRITE      0x120116
22 #define FILE_GENERIC_EXECUTE    0X1200a0
23
24 #define KSMBD_START_FID         0
25 #define KSMBD_NO_FID            (INT_MAX)
26 #define SMB2_NO_FID             (0xFFFFFFFFFFFFFFFFULL)
27
28 struct ksmbd_conn;
29 struct ksmbd_session;
30
31 struct ksmbd_lock {
32         struct file_lock *fl;
33         struct list_head glist;
34         struct list_head llist;
35         unsigned int flags;
36         int cmd;
37         int zero_len;
38         unsigned long long start;
39         unsigned long long end;
40 };
41
42 struct stream {
43         char *name;
44         ssize_t size;
45 };
46
47 struct ksmbd_inode {
48         rwlock_t                        m_lock;
49         atomic_t                        m_count;
50         atomic_t                        op_count;
51         /* opinfo count for streams */
52         atomic_t                        sop_count;
53         struct inode                    *m_inode;
54         unsigned int                    m_flags;
55         struct hlist_node               m_hash;
56         struct list_head                m_fp_list;
57         struct list_head                m_op_list;
58         struct oplock_info              *m_opinfo;
59         __le32                          m_fattr;
60 };
61
62 struct ksmbd_file {
63         struct file                     *filp;
64         char                            *filename;
65         u64                             persistent_id;
66         u64                             volatile_id;
67
68         spinlock_t                      f_lock;
69
70         struct ksmbd_inode              *f_ci;
71         struct ksmbd_inode              *f_parent_ci;
72         struct oplock_info __rcu        *f_opinfo;
73         struct ksmbd_conn               *conn;
74         struct ksmbd_tree_connect       *tcon;
75
76         atomic_t                        refcount;
77         __le32                          daccess;
78         __le32                          saccess;
79         __le32                          coption;
80         __le32                          cdoption;
81         __u64                           create_time;
82         __u64                           itime;
83
84         bool                            is_nt_open;
85         bool                            attrib_only;
86
87         char                            client_guid[16];
88         char                            create_guid[16];
89         char                            app_instance_id[16];
90
91         struct stream                   stream;
92         struct list_head                node;
93         struct list_head                blocked_works;
94
95         int                             durable_timeout;
96
97         /* for SMB1 */
98         int                             pid;
99
100         /* conflict lock fail count for SMB1 */
101         unsigned int                    cflock_cnt;
102         /* last lock failure start offset for SMB1 */
103         unsigned long long              llock_fstart;
104
105         int                             dirent_offset;
106
107         /* if ls is happening on directory, below is valid*/
108         struct ksmbd_readdir_data       readdir_data;
109         int                             dot_dotdot[2];
110 };
111
112 static inline void set_ctx_actor(struct dir_context *ctx,
113                                  filldir_t actor)
114 {
115         ctx->actor = actor;
116 }
117
118 #define KSMBD_NR_OPEN_DEFAULT BITS_PER_LONG
119
120 struct ksmbd_file_table {
121         rwlock_t                lock;
122         struct idr              *idr;
123 };
124
125 static inline bool has_file_id(u64 id)
126 {
127         return id < KSMBD_NO_FID;
128 }
129
130 static inline bool ksmbd_stream_fd(struct ksmbd_file *fp)
131 {
132         return fp->stream.name != NULL;
133 }
134
135 int ksmbd_init_file_table(struct ksmbd_file_table *ft);
136 void ksmbd_destroy_file_table(struct ksmbd_file_table *ft);
137 int ksmbd_close_fd(struct ksmbd_work *work, u64 id);
138 struct ksmbd_file *ksmbd_lookup_fd_fast(struct ksmbd_work *work, u64 id);
139 struct ksmbd_file *ksmbd_lookup_foreign_fd(struct ksmbd_work *work, u64 id);
140 struct ksmbd_file *ksmbd_lookup_fd_slow(struct ksmbd_work *work, u64 id,
141                                         u64 pid);
142 void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp);
143 struct ksmbd_file *ksmbd_lookup_durable_fd(unsigned long long id);
144 struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
145 struct ksmbd_file *ksmbd_lookup_fd_inode(struct inode *inode);
146 unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
147 struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
148 void ksmbd_close_tree_conn_fds(struct ksmbd_work *work);
149 void ksmbd_close_session_fds(struct ksmbd_work *work);
150 int ksmbd_close_inode_fds(struct ksmbd_work *work, struct inode *inode);
151 int ksmbd_init_global_file_table(void);
152 void ksmbd_free_global_file_table(void);
153 int ksmbd_file_table_flush(struct ksmbd_work *work);
154 void ksmbd_set_fd_limit(unsigned long limit);
155
156 /*
157  * INODE hash
158  */
159 int __init ksmbd_inode_hash_init(void);
160 void ksmbd_release_inode_hash(void);
161
162 enum KSMBD_INODE_STATUS {
163         KSMBD_INODE_STATUS_OK,
164         KSMBD_INODE_STATUS_UNKNOWN,
165         KSMBD_INODE_STATUS_PENDING_DELETE,
166 };
167
168 int ksmbd_query_inode_status(struct inode *inode);
169 bool ksmbd_inode_pending_delete(struct ksmbd_file *fp);
170 void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp);
171 void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp);
172 void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp,
173                                   int file_info);
174 int ksmbd_init_file_cache(void);
175 void ksmbd_exit_file_cache(void);
176 #endif /* __VFS_CACHE_H__ */