1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef NET_9P_CLIENT_H
27#define NET_9P_CLIENT_H
28
29#include <linux/utsname.h>
30
31
32#define P9_ROW_MAXTAG 255
33
34
35
36
37
38
39
40enum p9_proto_versions{
41 p9_proto_legacy,
42 p9_proto_2000u,
43 p9_proto_2000L,
44};
45
46
47
48
49
50
51
52
53
54
55
56
57enum p9_trans_status {
58 Connected,
59 BeginDisconnect,
60 Disconnected,
61 Hung,
62};
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80enum p9_req_status_t {
81 REQ_STATUS_IDLE,
82 REQ_STATUS_ALLOC,
83 REQ_STATUS_UNSENT,
84 REQ_STATUS_SENT,
85 REQ_STATUS_RCVD,
86 REQ_STATUS_FLSHD,
87 REQ_STATUS_ERROR,
88};
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112struct p9_req_t {
113 int status;
114 int t_err;
115 wait_queue_head_t *wq;
116 struct p9_fcall *tc;
117 struct p9_fcall *rc;
118 void *aux;
119
120 struct list_head req_list;
121};
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152struct p9_client {
153 spinlock_t lock;
154 unsigned int msize;
155 unsigned char proto_version;
156 struct p9_trans_module *trans_mod;
157 enum p9_trans_status status;
158 void *trans;
159
160 union {
161 struct {
162 int rfd;
163 int wfd;
164 } fd;
165 struct {
166 u16 port;
167 bool privport;
168
169 } tcp;
170 } trans_opts;
171
172 struct p9_idpool *fidpool;
173 struct list_head fidlist;
174
175 struct p9_idpool *tagpool;
176 struct p9_req_t *reqs[P9_ROW_MAXTAG];
177 int max_tag;
178
179 char name[__NEW_UTS_LEN + 1];
180};
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197struct p9_fid {
198 struct p9_client *clnt;
199 u32 fid;
200 int mode;
201 struct p9_qid qid;
202 u32 iounit;
203 kuid_t uid;
204
205 void *rdir;
206
207 struct list_head flist;
208 struct hlist_node dlist;
209};
210
211
212
213
214
215
216
217
218
219struct p9_dirent {
220 struct p9_qid qid;
221 u64 d_off;
222 unsigned char d_type;
223 char d_name[256];
224};
225
226struct iov_iter;
227
228int p9_show_client_options(struct seq_file *m, struct p9_client *clnt);
229int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
230int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid,
231 const char *name);
232int p9_client_renameat(struct p9_fid *olddirfid, const char *old_name,
233 struct p9_fid *newdirfid, const char *new_name);
234struct p9_client *p9_client_create(const char *dev_name, char *options);
235void p9_client_destroy(struct p9_client *clnt);
236void p9_client_disconnect(struct p9_client *clnt);
237void p9_client_begin_disconnect(struct p9_client *clnt);
238struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
239 const char *uname, kuid_t n_uname, const char *aname);
240struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,
241 const unsigned char * const *wnames, int clone);
242int p9_client_open(struct p9_fid *fid, int mode);
243int p9_client_fcreate(struct p9_fid *fid, const char *name, u32 perm, int mode,
244 char *extension);
245int p9_client_link(struct p9_fid *fid, struct p9_fid *oldfid, const char *newname);
246int p9_client_symlink(struct p9_fid *fid, const char *name, const char *symname,
247 kgid_t gid, struct p9_qid *qid);
248int p9_client_create_dotl(struct p9_fid *ofid, const char *name, u32 flags, u32 mode,
249 kgid_t gid, struct p9_qid *qid);
250int p9_client_clunk(struct p9_fid *fid);
251int p9_client_fsync(struct p9_fid *fid, int datasync);
252int p9_client_remove(struct p9_fid *fid);
253int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags);
254int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err);
255int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err);
256int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset);
257int p9dirent_read(struct p9_client *clnt, char *buf, int len,
258 struct p9_dirent *dirent);
259struct p9_wstat *p9_client_stat(struct p9_fid *fid);
260int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst);
261int p9_client_setattr(struct p9_fid *fid, struct p9_iattr_dotl *attr);
262
263struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid,
264 u64 request_mask);
265
266int p9_client_mknod_dotl(struct p9_fid *oldfid, const char *name, int mode,
267 dev_t rdev, kgid_t gid, struct p9_qid *);
268int p9_client_mkdir_dotl(struct p9_fid *fid, const char *name, int mode,
269 kgid_t gid, struct p9_qid *);
270int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status);
271int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *fl);
272struct p9_req_t *p9_tag_lookup(struct p9_client *, u16);
273void p9_client_cb(struct p9_client *c, struct p9_req_t *req, int status);
274
275int p9_parse_header(struct p9_fcall *, int32_t *, int8_t *, int16_t *, int);
276int p9stat_read(struct p9_client *, char *, int, struct p9_wstat *);
277void p9stat_free(struct p9_wstat *);
278
279int p9_is_proto_dotu(struct p9_client *clnt);
280int p9_is_proto_dotl(struct p9_client *clnt);
281struct p9_fid *p9_client_xattrwalk(struct p9_fid *, const char *, u64 *);
282int p9_client_xattrcreate(struct p9_fid *, const char *, u64, int);
283int p9_client_readlink(struct p9_fid *fid, char **target);
284
285#endif
286