fuse.h revision 1.4 1 /* $NetBSD: fuse.h,v 1.4 2011/06/28 16:19:16 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
173 FUSE_CUSE_INIT = 4096
174 };
175
176 enum fuse_notify_code {
177 FUSE_NOTIFY_POLL = 1,
178 FUSE_NOTIFY_INVAL_INODE = 2,
179 FUSE_NOTIFY_INVAL_ENTRY = 3,
180 FUSE_NOTIFY_CODE_MAX
181 };
182
183 #define FUSE_MIN_READ_BUFFER 8192
184
185 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
186
187 struct fuse_entry_out {
188 uint64_t nodeid;
189 uint64_t generation;
190 uint64_t entry_valid;
191 uint64_t attr_valid;
192 uint32_t entry_valid_nsec;
193 uint32_t attr_valid_nsec;
194 struct fuse_attr attr;
195 };
196
197 struct fuse_forget_in {
198 uint64_t nlookup;
199 };
200
201 struct fuse_getattr_in {
202 uint32_t getattr_flags;
203 uint32_t dummy;
204 uint64_t fh;
205 };
206
207 #define FUSE_COMPAT_ATTR_OUT_SIZE 96
208
209 struct fuse_attr_out {
210 uint64_t attr_valid;
211 uint32_t attr_valid_nsec;
212 uint32_t dummy;
213 struct fuse_attr attr;
214 };
215
216 #define FUSE_COMPAT_MKNOD_IN_SIZE 8
217
218 struct fuse_mknod_in {
219 uint32_t mode;
220 uint32_t rdev;
221 uint32_t umask;
222 uint32_t padding;
223 };
224
225 struct fuse_mkdir_in {
226 uint32_t mode;
227 uint32_t umask;
228 };
229
230 struct fuse_rename_in {
231 uint64_t newdir;
232 };
233
234 struct fuse_link_in {
235 uint64_t oldnodeid;
236 };
237
238 struct fuse_setattr_in {
239 uint32_t valid;
240 uint32_t padding;
241 uint64_t fh;
242 uint64_t size;
243 uint64_t lock_owner;
244 uint64_t atime;
245 uint64_t mtime;
246 uint64_t unused2;
247 uint32_t atimensec;
248 uint32_t mtimensec;
249 uint32_t unused3;
250 uint32_t mode;
251 uint32_t unused4;
252 uint32_t uid;
253 uint32_t gid;
254 uint32_t unused5;
255 };
256
257 struct fuse_open_in {
258 uint32_t flags;
259 uint32_t unused;
260 };
261
262 struct fuse_create_in {
263 uint32_t flags;
264 uint32_t mode;
265 uint32_t umask;
266 uint32_t padding;
267 };
268
269 struct fuse_open_out {
270 uint64_t fh;
271 uint32_t open_flags; /* FUSE_FOPEN_ */
272 uint32_t padding;
273 };
274
275 struct fuse_release_in {
276 uint64_t fh;
277 uint32_t flags;
278 uint32_t release_flags;
279 uint64_t lock_owner;
280 };
281
282 struct fuse_flush_in {
283 uint64_t fh;
284 uint32_t unused;
285 uint32_t padding;
286 uint64_t lock_owner;
287 };
288
289 struct fuse_read_in {
290 uint64_t fh;
291 uint64_t offset;
292 uint32_t size;
293 uint32_t read_flags;
294 uint64_t lock_owner;
295 uint32_t flags;
296 uint32_t padding;
297 };
298
299 #define FUSE_COMPAT_WRITE_IN_SIZE 24
300
301 struct fuse_write_in {
302 uint64_t fh;
303 uint64_t offset;
304 uint32_t size;
305 uint32_t write_flags;
306 uint64_t lock_owner;
307 uint32_t flags;
308 uint32_t padding;
309 };
310
311 struct fuse_write_out {
312 uint32_t size;
313 uint32_t padding;
314 };
315
316 #define FUSE_COMPAT_STATFS_SIZE 48
317
318 struct fuse_statfs_out {
319 struct fuse_kstatfs st;
320 };
321
322 struct fuse_fsync_in {
323 uint64_t fh;
324 uint32_t fsync_flags;
325 uint32_t padding;
326 };
327
328 struct fuse_setxattr_in {
329 uint32_t size;
330 uint32_t flags;
331 };
332
333 struct fuse_getxattr_in {
334 uint32_t size;
335 uint32_t padding;
336 };
337
338 struct fuse_getxattr_out {
339 uint32_t size;
340 uint32_t padding;
341 };
342
343 struct fuse_lk_in {
344 uint64_t fh;
345 uint64_t owner;
346 struct fuse_file_lock lk;
347 uint32_t lk_flags;
348 uint32_t padding;
349 };
350
351 struct fuse_lk_out {
352 struct fuse_file_lock lk;
353 };
354
355 struct fuse_access_in {
356 uint32_t mask;
357 uint32_t padding;
358 };
359
360 struct fuse_init_in {
361 uint32_t major;
362 uint32_t minor;
363 uint32_t max_readahead;
364 uint32_t flags;
365 };
366
367 struct fuse_init_out {
368 uint32_t major;
369 uint32_t minor;
370 uint32_t max_readahead;
371 uint32_t flags;
372 uint32_t unused;
373 uint32_t max_write;
374 };
375
376 #define FUSE_CUSE_INIT_INFO_MAX 4096
377
378 struct fuse_cuse_init_in {
379 uint32_t major;
380 uint32_t minor;
381 uint32_t unused;
382 uint32_t flags;
383 };
384
385 struct fuse_cuse_init_out {
386 uint32_t major;
387 uint32_t minor;
388 uint32_t unused;
389 uint32_t flags;
390 uint32_t max_read;
391 uint32_t max_write;
392 uint32_t dev_major; /* chardev major */
393 uint32_t dev_minor; /* chardev minor */
394 uint32_t spare[10];
395 };
396
397 struct fuse_interrupt_in {
398 uint64_t unique;
399 };
400
401 struct fuse_bmap_in {
402 uint64_t block;
403 uint32_t blocksize;
404 uint32_t padding;
405 };
406
407 struct fuse_bmap_out {
408 uint64_t block;
409 };
410
411 struct fuse_ioctl_in {
412 uint64_t fh;
413 uint32_t flags;
414 uint32_t cmd;
415 uint64_t arg;
416 uint32_t in_size;
417 uint32_t out_size;
418 };
419
420 struct fuse_ioctl_out {
421 int32_t result;
422 uint32_t flags;
423 uint32_t in_iovs;
424 uint32_t out_iovs;
425 };
426
427 struct fuse_poll_in {
428 uint64_t fh;
429 uint64_t kh;
430 uint32_t flags;
431 uint32_t padding;
432 };
433
434 struct fuse_poll_out {
435 uint32_t revents;
436 uint32_t padding;
437 };
438
439 struct fuse_notify_poll_wakeup_out {
440 uint64_t kh;
441 };
442
443 #if 0 /* Duplicated in perfuse.h to avoid making fuse.h public */
444 /* Send from kernel to proces */
445 struct fuse_in_header {
446 uint32_t len;
447 uint32_t opcode;
448 uint64_t unique;
449 uint64_t nodeid;
450 uint32_t uid;
451 uint32_t gid;
452 uint32_t pid;
453 uint32_t padding;
454 };
455
456 struct fuse_in_arg {
457 uint32_t size;
458 const void *value;
459 };
460
461 struct fuse_in {
462 struct fuse_in_header h;
463 uint32_t argpages:1; /* Req fits in a page? Always 1 */
464 uint32_t numargs;
465 struct fuse_in_arg args[3]; /* args copied to userspace */
466 };
467
468
469 /* From process to kernel */
470 struct fuse_out_header {
471 uint32_t len;
472 int32_t error;
473 uint64_t unique;
474 };
475 #endif
476
477 struct fuse_dirent {
478 uint64_t ino;
479 uint64_t off; /* offset of next field from after foh */
480 uint32_t namelen;
481 uint32_t type;
482 char name[0];
483 };
484
485 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
486 #define FUSE_DIRENT_ALIGN(x) \
487 (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
488 #define FUSE_DIRENT_SIZE(d) \
489 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
490
491 struct fuse_notify_inval_inode_out {
492 uint64_t ino;
493 int64_t off;
494 int64_t len;
495 };
496
497 struct fuse_notify_inval_entry_out {
498 uint64_t parent;
499 uint32_t namelen;
500 uint32_t padding;
501 };
502
503 #endif /* _FUSE_H */
504