qcow2: Get rid of additional sync on COW
[qemu.git] / hw / virtio-9p.h
blob0816ad66ecffbce0743d6a7a8964ce947b76a19f
1 #ifndef _QEMU_VIRTIO_9P_H
2 #define _QEMU_VIRTIO_9P_H
4 #include <sys/types.h>
5 #include <dirent.h>
6 #include <sys/time.h>
7 #include <utime.h>
9 #include "file-op-9p.h"
11 /* The feature bitmap for virtio 9P */
12 /* The mount point is specified in a config variable */
13 #define VIRTIO_9P_MOUNT_TAG 0
15 enum {
16 P9_TLERROR = 6,
17 P9_RLERROR,
18 P9_TSTATFS = 8,
19 P9_RSTATFS,
20 P9_TLOPEN = 12,
21 P9_RLOPEN,
22 P9_TLCREATE = 14,
23 P9_RLCREATE,
24 P9_TSYMLINK = 16,
25 P9_RSYMLINK,
26 P9_TMKNOD = 18,
27 P9_RMKNOD,
28 P9_TRENAME = 20,
29 P9_RRENAME,
30 P9_TGETATTR = 24,
31 P9_RGETATTR,
32 P9_TSETATTR = 26,
33 P9_RSETATTR,
34 P9_TXATTRWALK = 30,
35 P9_RXATTRWALK,
36 P9_TXATTRCREATE = 32,
37 P9_RXATTRCREATE,
38 P9_TREADDIR = 40,
39 P9_RREADDIR,
40 P9_TLINK = 70,
41 P9_RLINK,
42 P9_TMKDIR = 72,
43 P9_RMKDIR,
44 P9_TVERSION = 100,
45 P9_RVERSION,
46 P9_TAUTH = 102,
47 P9_RAUTH,
48 P9_TATTACH = 104,
49 P9_RATTACH,
50 P9_TERROR = 106,
51 P9_RERROR,
52 P9_TFLUSH = 108,
53 P9_RFLUSH,
54 P9_TWALK = 110,
55 P9_RWALK,
56 P9_TOPEN = 112,
57 P9_ROPEN,
58 P9_TCREATE = 114,
59 P9_RCREATE,
60 P9_TREAD = 116,
61 P9_RREAD,
62 P9_TWRITE = 118,
63 P9_RWRITE,
64 P9_TCLUNK = 120,
65 P9_RCLUNK,
66 P9_TREMOVE = 122,
67 P9_RREMOVE,
68 P9_TSTAT = 124,
69 P9_RSTAT,
70 P9_TWSTAT = 126,
71 P9_RWSTAT,
75 /* qid.types */
76 enum {
77 P9_QTDIR = 0x80,
78 P9_QTAPPEND = 0x40,
79 P9_QTEXCL = 0x20,
80 P9_QTMOUNT = 0x10,
81 P9_QTAUTH = 0x08,
82 P9_QTTMP = 0x04,
83 P9_QTSYMLINK = 0x02,
84 P9_QTLINK = 0x01,
85 P9_QTFILE = 0x00,
88 enum p9_proto_version {
89 V9FS_PROTO_2000U = 0x01,
90 V9FS_PROTO_2000L = 0x02,
93 #define P9_NOTAG (u16)(~0)
94 #define P9_NOFID (u32)(~0)
95 #define P9_MAXWELEM 16
98 * ample room for Twrite/Rread header
99 * size[4] Tread/Twrite tag[2] fid[4] offset[8] count[4]
101 #define P9_IOHDRSZ 24
103 typedef struct V9fsPDU V9fsPDU;
105 struct V9fsPDU
107 uint32_t size;
108 uint16_t tag;
109 uint8_t id;
110 VirtQueueElement elem;
111 QLIST_ENTRY(V9fsPDU) next;
115 /* FIXME
116 * 1) change user needs to set groups and stuff
119 /* from Linux's linux/virtio_9p.h */
121 /* The ID for virtio console */
122 #define VIRTIO_ID_9P 9
123 #define MAX_REQ 128
124 #define MAX_TAG_LEN 32
126 #define BUG_ON(cond) assert(!(cond))
128 typedef struct V9fsFidState V9fsFidState;
130 typedef struct V9fsString
132 int16_t size;
133 char *data;
134 } V9fsString;
136 typedef struct V9fsQID
138 int8_t type;
139 int32_t version;
140 int64_t path;
141 } V9fsQID;
143 typedef struct V9fsStat
145 int16_t size;
146 int16_t type;
147 int32_t dev;
148 V9fsQID qid;
149 int32_t mode;
150 int32_t atime;
151 int32_t mtime;
152 int64_t length;
153 V9fsString name;
154 V9fsString uid;
155 V9fsString gid;
156 V9fsString muid;
157 /* 9p2000.u */
158 V9fsString extension;
159 int32_t n_uid;
160 int32_t n_gid;
161 int32_t n_muid;
162 } V9fsStat;
164 enum {
165 P9_FID_NONE = 0,
166 P9_FID_FILE,
167 P9_FID_DIR,
168 P9_FID_XATTR,
171 typedef struct V9fsXattr
173 int64_t copied_len;
174 int64_t len;
175 void *value;
176 V9fsString name;
177 int flags;
178 } V9fsXattr;
180 struct V9fsFidState
182 int fid_type;
183 int32_t fid;
184 V9fsString path;
185 union {
186 int fd;
187 DIR *dir;
188 V9fsXattr xattr;
189 } fs;
190 uid_t uid;
191 V9fsFidState *next;
194 typedef struct V9fsState
196 VirtIODevice vdev;
197 VirtQueue *vq;
198 V9fsPDU pdus[MAX_REQ];
199 QLIST_HEAD(, V9fsPDU) free_list;
200 V9fsFidState *fid_list;
201 FileOperations *ops;
202 FsContext ctx;
203 uint16_t tag_len;
204 uint8_t *tag;
205 size_t config_size;
206 enum p9_proto_version proto_version;
207 int32_t msize;
208 } V9fsState;
210 typedef struct V9fsCreateState {
211 V9fsPDU *pdu;
212 size_t offset;
213 V9fsFidState *fidp;
214 V9fsQID qid;
215 int32_t perm;
216 int8_t mode;
217 struct stat stbuf;
218 V9fsString name;
219 V9fsString extension;
220 V9fsString fullname;
221 int iounit;
222 } V9fsCreateState;
224 typedef struct V9fsLcreateState {
225 V9fsPDU *pdu;
226 size_t offset;
227 V9fsFidState *fidp;
228 V9fsQID qid;
229 int32_t iounit;
230 struct stat stbuf;
231 V9fsString name;
232 V9fsString fullname;
233 } V9fsLcreateState;
235 typedef struct V9fsStatState {
236 V9fsPDU *pdu;
237 size_t offset;
238 V9fsStat v9stat;
239 V9fsFidState *fidp;
240 struct stat stbuf;
241 } V9fsStatState;
243 typedef struct V9fsStatDotl {
244 uint64_t st_result_mask;
245 V9fsQID qid;
246 uint32_t st_mode;
247 uint32_t st_uid;
248 uint32_t st_gid;
249 uint64_t st_nlink;
250 uint64_t st_rdev;
251 uint64_t st_size;
252 uint64_t st_blksize;
253 uint64_t st_blocks;
254 uint64_t st_atime_sec;
255 uint64_t st_atime_nsec;
256 uint64_t st_mtime_sec;
257 uint64_t st_mtime_nsec;
258 uint64_t st_ctime_sec;
259 uint64_t st_ctime_nsec;
260 uint64_t st_btime_sec;
261 uint64_t st_btime_nsec;
262 uint64_t st_gen;
263 uint64_t st_data_version;
264 } V9fsStatDotl;
266 typedef struct V9fsStatStateDotl {
267 V9fsPDU *pdu;
268 size_t offset;
269 V9fsStatDotl v9stat_dotl;
270 struct stat stbuf;
271 } V9fsStatStateDotl;
274 typedef struct V9fsWalkState {
275 V9fsPDU *pdu;
276 size_t offset;
277 int16_t nwnames;
278 int name_idx;
279 V9fsQID *qids;
280 V9fsFidState *fidp;
281 V9fsFidState *newfidp;
282 V9fsString path;
283 V9fsString *wnames;
284 struct stat stbuf;
285 } V9fsWalkState;
287 typedef struct V9fsOpenState {
288 V9fsPDU *pdu;
289 size_t offset;
290 int32_t mode;
291 V9fsFidState *fidp;
292 V9fsQID qid;
293 struct stat stbuf;
294 int iounit;
295 } V9fsOpenState;
297 typedef struct V9fsReadState {
298 V9fsPDU *pdu;
299 size_t offset;
300 int32_t count;
301 int32_t total;
302 int64_t off;
303 V9fsFidState *fidp;
304 struct iovec iov[128]; /* FIXME: bad, bad, bad */
305 struct iovec *sg;
306 off_t dir_pos;
307 struct dirent *dent;
308 struct stat stbuf;
309 V9fsString name;
310 V9fsStat v9stat;
311 int32_t len;
312 int32_t cnt;
313 int32_t max_count;
314 } V9fsReadState;
316 typedef struct V9fsWriteState {
317 V9fsPDU *pdu;
318 size_t offset;
319 int32_t len;
320 int32_t count;
321 int32_t total;
322 int64_t off;
323 V9fsFidState *fidp;
324 struct iovec iov[128]; /* FIXME: bad, bad, bad */
325 struct iovec *sg;
326 int cnt;
327 } V9fsWriteState;
329 typedef struct V9fsRemoveState {
330 V9fsPDU *pdu;
331 size_t offset;
332 V9fsFidState *fidp;
333 } V9fsRemoveState;
335 typedef struct V9fsWstatState
337 V9fsPDU *pdu;
338 size_t offset;
339 int16_t unused;
340 V9fsStat v9stat;
341 V9fsFidState *fidp;
342 struct stat stbuf;
343 } V9fsWstatState;
345 typedef struct V9fsSymlinkState
347 V9fsPDU *pdu;
348 size_t offset;
349 V9fsString name;
350 V9fsString symname;
351 V9fsString fullname;
352 V9fsFidState *dfidp;
353 V9fsQID qid;
354 struct stat stbuf;
355 } V9fsSymlinkState;
357 typedef struct V9fsIattr
359 int32_t valid;
360 int32_t mode;
361 int32_t uid;
362 int32_t gid;
363 int64_t size;
364 int64_t atime_sec;
365 int64_t atime_nsec;
366 int64_t mtime_sec;
367 int64_t mtime_nsec;
368 } V9fsIattr;
370 typedef struct V9fsSetattrState
372 V9fsPDU *pdu;
373 size_t offset;
374 V9fsIattr v9iattr;
375 V9fsFidState *fidp;
376 } V9fsSetattrState;
378 struct virtio_9p_config
380 /* number of characters in tag */
381 uint16_t tag_len;
382 /* Variable size tag name */
383 uint8_t tag[0];
384 } __attribute__((packed));
386 typedef struct V9fsStatfs
388 uint32_t f_type;
389 uint32_t f_bsize;
390 uint64_t f_blocks;
391 uint64_t f_bfree;
392 uint64_t f_bavail;
393 uint64_t f_files;
394 uint64_t f_ffree;
395 uint64_t fsid_val;
396 uint32_t f_namelen;
397 } V9fsStatfs;
399 typedef struct V9fsStatfsState {
400 V9fsPDU *pdu;
401 size_t offset;
402 int32_t fid;
403 V9fsStatfs v9statfs;
404 V9fsFidState *fidp;
405 struct statfs stbuf;
406 } V9fsStatfsState;
408 typedef struct V9fsMkState {
409 V9fsPDU *pdu;
410 size_t offset;
411 V9fsQID qid;
412 struct stat stbuf;
413 V9fsString name;
414 V9fsString fullname;
415 } V9fsMkState;
417 typedef struct V9fsRenameState {
418 V9fsPDU *pdu;
419 V9fsFidState *fidp;
420 size_t offset;
421 int32_t newdirfid;
422 V9fsString name;
423 } V9fsRenameState;
425 typedef struct V9fsXattrState
427 V9fsPDU *pdu;
428 size_t offset;
429 V9fsFidState *file_fidp;
430 V9fsFidState *xattr_fidp;
431 V9fsString name;
432 int64_t size;
433 int flags;
434 void *value;
435 } V9fsXattrState;
437 extern size_t pdu_packunpack(void *addr, struct iovec *sg, int sg_count,
438 size_t offset, size_t size, int pack);
440 static inline size_t do_pdu_unpack(void *dst, struct iovec *sg, int sg_count,
441 size_t offset, size_t size)
443 return pdu_packunpack(dst, sg, sg_count, offset, size, 0);
446 #endif