1
2
3
4
5
6
7
8#ifndef FS_9P_V9FS_H
9#define FS_9P_V9FS_H
10
11#include <linux/backing-dev.h>
12#include <linux/netfs.h>
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#define V9FS_ACCESS_ANY (V9FS_ACCESS_SINGLE | \
28 V9FS_ACCESS_USER | \
29 V9FS_ACCESS_CLIENT)
30#define V9FS_ACCESS_MASK V9FS_ACCESS_ANY
31#define V9FS_ACL_MASK V9FS_POSIX_ACL
32
33enum p9_session_flags {
34 V9FS_PROTO_2000U = 0x01,
35 V9FS_PROTO_2000L = 0x02,
36 V9FS_ACCESS_SINGLE = 0x04,
37 V9FS_ACCESS_USER = 0x08,
38 V9FS_ACCESS_CLIENT = 0x10,
39 V9FS_POSIX_ACL = 0x20
40};
41
42
43
44
45
46
47
48
49
50
51enum p9_cache_modes {
52 CACHE_NONE,
53 CACHE_MMAP,
54 CACHE_LOOSE,
55 CACHE_FSCACHE,
56 nr__p9_cache_modes
57};
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84struct v9fs_session_info {
85
86 unsigned char flags;
87 unsigned char nodev;
88 unsigned short debug;
89 unsigned int afid;
90 unsigned int cache;
91#ifdef CONFIG_9P_FSCACHE
92 char *cachetag;
93 struct fscache_volume *fscache;
94#endif
95
96 char *uname;
97 char *aname;
98 unsigned int maxdata;
99 kuid_t dfltuid;
100 kgid_t dfltgid;
101 kuid_t uid;
102 struct p9_client *clnt;
103 struct list_head slist;
104 struct rw_semaphore rename_sem;
105 long session_lock_timeout;
106};
107
108
109#define V9FS_INO_INVALID_ATTR 0x01
110
111struct v9fs_inode {
112 struct {
113
114 struct inode vfs_inode;
115 struct netfs_i_context netfs_ctx;
116 };
117 struct p9_qid qid;
118 unsigned int cache_validity;
119 struct p9_fid *writeback_fid;
120 struct mutex v_mutex;
121};
122
123static inline struct v9fs_inode *V9FS_I(const struct inode *inode)
124{
125 return container_of(inode, struct v9fs_inode, vfs_inode);
126}
127
128static inline struct fscache_cookie *v9fs_inode_cookie(struct v9fs_inode *v9inode)
129{
130#ifdef CONFIG_9P_FSCACHE
131 return netfs_i_cookie(&v9inode->vfs_inode);
132#else
133 return NULL;
134#endif
135}
136
137static inline struct fscache_volume *v9fs_session_cache(struct v9fs_session_info *v9ses)
138{
139#ifdef CONFIG_9P_FSCACHE
140 return v9ses->fscache;
141#else
142 return NULL;
143#endif
144}
145
146
147extern int v9fs_show_options(struct seq_file *m, struct dentry *root);
148
149struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
150 const char *dev_name, char *data);
151extern void v9fs_session_close(struct v9fs_session_info *v9ses);
152extern void v9fs_session_cancel(struct v9fs_session_info *v9ses);
153extern void v9fs_session_begin_cancel(struct v9fs_session_info *v9ses);
154extern struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
155 unsigned int flags);
156extern int v9fs_vfs_unlink(struct inode *i, struct dentry *d);
157extern int v9fs_vfs_rmdir(struct inode *i, struct dentry *d);
158extern int v9fs_vfs_rename(struct user_namespace *mnt_userns,
159 struct inode *old_dir, struct dentry *old_dentry,
160 struct inode *new_dir, struct dentry *new_dentry,
161 unsigned int flags);
162extern struct inode *v9fs_inode_from_fid(struct v9fs_session_info *v9ses,
163 struct p9_fid *fid,
164 struct super_block *sb, int new);
165extern const struct inode_operations v9fs_dir_inode_operations_dotl;
166extern const struct inode_operations v9fs_file_inode_operations_dotl;
167extern const struct inode_operations v9fs_symlink_inode_operations_dotl;
168extern const struct netfs_request_ops v9fs_req_ops;
169extern struct inode *v9fs_inode_from_fid_dotl(struct v9fs_session_info *v9ses,
170 struct p9_fid *fid,
171 struct super_block *sb, int new);
172
173
174#define V9FS_PORT 564
175#define V9FS_DEFUSER "nobody"
176#define V9FS_DEFANAME ""
177#define V9FS_DEFUID KUIDT_INIT(-2)
178#define V9FS_DEFGID KGIDT_INIT(-2)
179
180static inline struct v9fs_session_info *v9fs_inode2v9ses(struct inode *inode)
181{
182 return inode->i_sb->s_fs_info;
183}
184
185static inline struct v9fs_session_info *v9fs_dentry2v9ses(struct dentry *dentry)
186{
187 return dentry->d_sb->s_fs_info;
188}
189
190static inline int v9fs_proto_dotu(struct v9fs_session_info *v9ses)
191{
192 return v9ses->flags & V9FS_PROTO_2000U;
193}
194
195static inline int v9fs_proto_dotl(struct v9fs_session_info *v9ses)
196{
197 return v9ses->flags & V9FS_PROTO_2000L;
198}
199
200
201
202
203
204
205
206
207
208static inline struct inode *
209v9fs_get_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
210 struct super_block *sb)
211{
212 if (v9fs_proto_dotl(v9ses))
213 return v9fs_inode_from_fid_dotl(v9ses, fid, sb, 0);
214 else
215 return v9fs_inode_from_fid(v9ses, fid, sb, 0);
216}
217
218
219
220
221
222
223
224
225
226static inline struct inode *
227v9fs_get_new_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
228 struct super_block *sb)
229{
230 if (v9fs_proto_dotl(v9ses))
231 return v9fs_inode_from_fid_dotl(v9ses, fid, sb, 1);
232 else
233 return v9fs_inode_from_fid(v9ses, fid, sb, 1);
234}
235
236#endif
237