fuse.h revision 1.5 1 /* $NetBSD: fuse.h,v 1.5 2011/12/28 17:33:53 manu Exp $ */
2
3 /*-
4 * Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifndef _FUSE_H
29 #define _FUSE_H
30
31 #define FUSE_KERNEL_VERSION 7
32 #define FUSE_KERNEL_MINOR_VERSION 12
33 #define FUSE_ROOT_ID 1
34 #define FUSE_UNKNOWN_FH (uint64_t)0
35
36 #ifndef FUSE_BUFSIZE
37 #define FUSE_MIN_BUFSIZE 0x21000
38 #define FUSE_PREF_BUFSIZE (sysconf(_SC_PAGESIZE) + 0x1000)
39 #define FUSE_BUFSIZE MAX(FUSE_PREF_BUFSIZE /* CONSTCOND */, FUSE_MIN_BUFSIZE)
40 #endif /* FUSE_BUFSIZE */
41
42 /* From <linux/limits.h> */
43 #define LINUX_XATTR_NAME_MAX 255
44 #define LINUX_XATTR_SIZE_MAX 65536
45 #define LINUX_XATTR_LIST_MAX 65536
46
47 struct fuse_attr {
48 uint64_t ino;
49 uint64_t size;
50 uint64_t blocks;
51 uint64_t atime;
52 uint64_t mtime;
53 uint64_t ctime;
54 uint32_t atimensec;
55 uint32_t mtimensec;
56 uint32_t ctimensec;
57 uint32_t mode;
58 uint32_t nlink;
59 uint32_t uid;
60 uint32_t gid;
61 uint32_t rdev;
62 uint32_t blksize;
63 uint32_t padding;
64 };
65
66 struct fuse_kstatfs {
67 uint64_t blocks;
68 uint64_t bfree;
69 uint64_t bavail;
70 uint64_t files;
71 uint64_t ffree;
72 uint32_t bsize;
73 uint32_t namelen;
74 uint32_t frsize;
75 uint32_t padding;
76 uint32_t spare[6];
77 };
78
79 struct fuse_file_lock {
80 uint64_t start;
81 uint64_t end;
82 uint32_t type;
83 uint32_t pid;
84 };
85
86 /*
87 * Various flags
88 */
89 #define FUSE_FATTR_MODE 0x0001
90 #define FUSE_FATTR_UID 0x0002
91 #define FUSE_FATTR_GID 0x0004
92 #define FUSE_FATTR_SIZE 0x0008
93 #define FUSE_FATTR_ATIME 0x0010
94 #define FUSE_FATTR_MTIME 0x0020
95 #define FUSE_FATTR_FH 0x0040
96 #define FUSE_FATTR_ATIME_NOW 0x0080
97 #define FUSE_FATTR_MTIME_NOW 0x0100
98 #define FUSE_FATTR_LOCKOWNER 0x0200
99
100 #define FUSE_FOPEN_DIRECT_IO 0x0001
101 #define FUSE_FOPEN_KEEP_CACHE 0x0002
102 #define FUSE_FOPEN_NONSEEKABLE 0x0004
103
104 #define FUSE_ASYNC_READ 0x0001
105 #define FUSE_POSIX_LOCKS 0x0002
106 #define FUSE_FILE_OPS 0x0004
107 #define FUSE_ATOMIC_O_TRUNC 0x0008
108 #define FUSE_EXPORT_SUPPORT 0x0010
109 #define FUSE_BIG_WRITES 0x0020
110 #define FUSE_DONT_MASK 0x0040
111
112 #define FUSE_CUSE_UNRESTRICTED_IOCTL 0x0001
113
114 #define FUSE_RELEASE_FLUSH 0x0001
115
116 #define FUSE_GETATTR_FH 0x0001
117
118 #define FUSE_LK_FLOCK 0x0001
119
120 #define FUSE_WRITE_CACHE 0x0001
121 #define FUSE_WRITE_LOCKOWNER 0x0002
122
123 #define FUSE_READ_LOCKOWNER 0x0002
124
125 #define FUSE_IOCTL_COMPAT 0x0001
126 #define FUSE_IOCTL_UNRESTRICTED 0x0002
127 #define FUSE_IOCTL_RETRY 0x0004
128
129 #define FUSE_IOCTL_MAX_IOV 256
130
131 #define FUSE_POLL_SCHEDULE_NOTIFY 0x0001
132
133 enum fuse_opcode {
134 FUSE_LOOKUP = 1,
135 FUSE_FORGET = 2,
136 FUSE_GETATTR = 3,
137 FUSE_SETATTR = 4,
138 FUSE_READLINK = 5,
139 FUSE_SYMLINK = 6,
140 FUSE_MKNOD = 8,
141 FUSE_MKDIR = 9,
142 FUSE_UNLINK = 10,
143 FUSE_RMDIR = 11,
144 FUSE_RENAME = 12,
145 FUSE_LINK = 13,
146 FUSE_OPEN = 14,
147 FUSE_READ = 15,
148 FUSE_WRITE = 16,
149 FUSE_STATFS = 17,
150 FUSE_RELEASE = 18,
151 FUSE_FSYNC = 20,
152 FUSE_SETXATTR = 21,
153 FUSE_GETXATTR = 22,
154 FUSE_LISTXATTR = 23,
155 FUSE_REMOVEXATTR = 24,
156 FUSE_FLUSH = 25,
157 FUSE_INIT = 26,
158 FUSE_OPENDIR = 27,
159 FUSE_READDIR = 28,
160 FUSE_RELEASEDIR = 29,
161 FUSE_FSYNCDIR = 30,
162 FUSE_GETLK = 31,
163 FUSE_SETLK = 32,
164 FUSE_SETLKW = 33,
165 FUSE_ACCESS = 34,
166 FUSE_CREATE = 35,
167 FUSE_INTERRUPT = 36,
168 FUSE_BMAP = 37,
169 FUSE_DESTROY = 38,
170 FUSE_IOCTL = 39,
171 FUSE_POLL = 40,
172 FUSE_OPCODE_MAX,
173
174 FUSE_CUSE_INIT = 4096
175 };
176
177 enum fuse_notify_code {
178 FUSE_NOTIFY_POLL = 1,
179 FUSE_NOTIFY_INVAL_INODE = 2,
180 FUSE_NOTIFY_INVAL_ENTRY = 3,
181 FUSE_NOTIFY_CODE_MAX
182 };
183
184 #define FUSE_MIN_READ_BUFFER 8192
185
186 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
187
188 struct fuse_entry_out {
189 uint64_t nodeid;
190 uint64_t generation;
191 uint64_t entry_valid;
192 uint64_t attr_valid;
193 uint32_t entry_valid_nsec;
194 uint32_t attr_valid_nsec;
195 struct fuse_attr attr;
196 };
197
198 struct fuse_forget_in {
199 uint64_t nlookup;
200 };
201
202 struct fuse_getattr_in {
203 uint32_t getattr_flags;
204 uint32_t dummy;
205 uint64_t fh;
206 };
207
208 #define FUSE_COMPAT_ATTR_OUT_SIZE 96
209
210 struct fuse_attr_out {
211 uint64_t attr_valid;
212 uint32_t attr_valid_nsec;
213 uint32_t dummy;
214 struct fuse_attr attr;
215 };
216
217 #define FUSE_COMPAT_MKNOD_IN_SIZE 8
218
219 struct fuse_mknod_in {
220 uint32_t mode;
221 uint32_t rdev;
222 uint32_t umask;
223 uint32_t padding;
224 };
225
226 struct fuse_mkdir_in {
227 uint32_t mode;
228 uint32_t umask;
229 };
230
231 struct fuse_rename_in {
232 uint64_t newdir;
233 };
234
235 struct fuse_link_in {
236 uint64_t oldnodeid;
237 };
238
239 struct fuse_setattr_in {
240 uint32_t valid;
241 uint32_t padding;
242 uint64_t fh;
243 uint64_t size;
244 uint64_t lock_owner;
245 uint64_t atime;
246 uint64_t mtime;
247 uint64_t unused2;
248 uint32_t atimensec;
249 uint32_t mtimensec;
250 uint32_t unused3;
251 uint32_t mode;
252 uint32_t unused4;
253 uint32_t uid;
254 uint32_t gid;
255 uint32_t unused5;
256 };
257
258 struct fuse_open_in {
259 uint32_t flags;
260 uint32_t unused;
261 };
262
263 struct fuse_create_in {
264 uint32_t flags;
265 uint32_t mode;
266 uint32_t umask;
267 uint32_t padding;
268 };
269
270 struct fuse_open_out {
271 uint64_t fh;
272 uint32_t open_flags; /* FUSE_FOPEN_ */
273 uint32_t padding;
274 };
275
276 struct fuse_release_in {
277 uint64_t fh;
278 uint32_t flags;
279 uint32_t release_flags;
280 uint64_t lock_owner;
281 };
282
283 struct fuse_flush_in {
284 uint64_t fh;
285 uint32_t unused;
286 uint32_t padding;
287 uint64_t lock_owner;
288 };
289
290 struct fuse_read_in {
291 uint64_t fh;
292 uint64_t offset;
293 uint32_t size;
294 uint32_t read_flags;
295 uint64_t lock_owner;
296 uint32_t flags;
297 uint32_t padding;
298 };
299
300 #define FUSE_COMPAT_WRITE_IN_SIZE 24
301
302 struct fuse_write_in {
303 uint64_t fh;
304 uint64_t offset;
305 uint32_t size;
306 uint32_t write_flags;
307 uint64_t lock_owner;
308 uint32_t flags;
309 uint32_t padding;
310 };
311
312 struct fuse_write_out {
313 uint32_t size;
314 uint32_t padding;
315 };
316
317 #define FUSE_COMPAT_STATFS_SIZE 48
318
319 struct fuse_statfs_out {
320 struct fuse_kstatfs st;
321 };
322
323 struct fuse_fsync_in {
324 uint64_t fh;
325 uint32_t fsync_flags;
326 uint32_t padding;
327 };
328
329 struct fuse_setxattr_in {
330 uint32_t size;
331 uint32_t flags;
332 };
333
334 struct fuse_getxattr_in {
335 uint32_t size;
336 uint32_t padding;
337 };
338
339 struct fuse_getxattr_out {
340 uint32_t size;
341 uint32_t padding;
342 };
343
344 struct fuse_lk_in {
345 uint64_t fh;
346 uint64_t owner;
347 struct fuse_file_lock lk;
348 uint32_t lk_flags;
349 uint32_t padding;
350 };
351
352 struct fuse_lk_out {
353 struct fuse_file_lock lk;
354 };
355
356 struct fuse_access_in {
357 uint32_t mask;
358 uint32_t padding;
359 };
360
361 struct fuse_init_in {
362 uint32_t major;
363 uint32_t minor;
364 uint32_t max_readahead;
365 uint32_t flags;
366 };
367
368 struct fuse_init_out {
369 uint32_t major;
370 uint32_t minor;
371 uint32_t max_readahead;
372 uint32_t flags;
373 uint32_t unused;
374 uint32_t max_write;
375 };
376
377 #define FUSE_CUSE_INIT_INFO_MAX 4096
378
379 struct fuse_cuse_init_in {
380 uint32_t major;
381 uint32_t minor;
382 uint32_t unused;
383 uint32_t flags;
384 };
385
386 struct fuse_cuse_init_out {
387 uint32_t major;
388 uint32_t minor;
389 uint32_t unused;
390 uint32_t flags;
391 uint32_t max_read;
392 uint32_t max_write;
393 uint32_t dev_major; /* chardev major */
394 uint32_t dev_minor; /* chardev minor */
395 uint32_t spare[10];
396 };
397
398 struct fuse_interrupt_in {
399 uint64_t unique;
400 };
401
402 struct fuse_bmap_in {
403 uint64_t block;
404 uint32_t blocksize;
405 uint32_t padding;
406 };
407
408 struct fuse_bmap_out {
409 uint64_t block;
410 };
411
412 struct fuse_ioctl_in {
413 uint64_t fh;
414 uint32_t flags;
415 uint32_t cmd;
416 uint64_t arg;
417 uint32_t in_size;
418 uint32_t out_size;
419 };
420
421 struct fuse_ioctl_out {
422 int32_t result;
423 uint32_t flags;
424 uint32_t in_iovs;
425 uint32_t out_iovs;
426 };
427
428 struct fuse_poll_in {
429 uint64_t fh;
430 uint64_t kh;
431 uint32_t flags;
432 uint32_t padding;
433 };
434
435 struct fuse_poll_out {
436 uint32_t revents;
437 uint32_t padding;
438 };
439
440 struct fuse_notify_poll_wakeup_out {
441 uint64_t kh;
442 };
443
444 #if 0 /* Duplicated in perfuse.h to avoid making fuse.h public */
445 /* Send from kernel to proces */
446 struct fuse_in_header {
447 uint32_t len;
448 uint32_t opcode;
449 uint64_t unique;
450 uint64_t nodeid;
451 uint32_t uid;
452 uint32_t gid;
453 uint32_t pid;
454 uint32_t padding;
455 };
456
457 struct fuse_in_arg {
458 uint32_t size;
459 const void *value;
460 };
461
462 struct fuse_in {
463 struct fuse_in_header h;
464 uint32_t argpages:1; /* Req fits in a page? Always 1 */
465 uint32_t numargs;
466 struct fuse_in_arg args[3]; /* args copied to userspace */
467 };
468
469
470 /* From process to kernel */
471 struct fuse_out_header {
472 uint32_t len;
473 int32_t error;
474 uint64_t unique;
475 };
476 #endif
477
478 struct fuse_dirent {
479 uint64_t ino;
480 uint64_t off; /* offset of next field from after foh */
481 uint32_t namelen;
482 uint32_t type;
483 char name[0];
484 };
485
486 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
487 #define FUSE_DIRENT_ALIGN(x) \
488 (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
489 #define FUSE_DIRENT_SIZE(d) \
490 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
491
492 struct fuse_notify_inval_inode_out {
493 uint64_t ino;
494 int64_t off;
495 int64_t len;
496 };
497
498 struct fuse_notify_inval_entry_out {
499 uint64_t parent;
500 uint32_t namelen;
501 uint32_t padding;
502 };
503
504 #endif /* _FUSE_H */
505