1 /*-
2 * SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause)
3 *
4 * This file defines the kernel interface of FUSE
5 * Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
6 *
7 * This program can be distributed under the terms of the GNU GPL.
8 * See the file COPYING.
9 *
10 * This -- and only this -- header file may also be distributed under
11 * the terms of the BSD Licence as follows:
12 *
13 * Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * $FreeBSD$
37 */
38
39 /*
40 * This file defines the kernel interface of FUSE
41 *
42 * Protocol changelog:
43 *
44 * 7.1:
45 * - add the following messages:
46 * FUSE_SETATTR, FUSE_SYMLINK, FUSE_MKNOD, FUSE_MKDIR, FUSE_UNLINK,
47 * FUSE_RMDIR, FUSE_RENAME, FUSE_LINK, FUSE_OPEN, FUSE_READ, FUSE_WRITE,
48 * FUSE_RELEASE, FUSE_FSYNC, FUSE_FLUSH, FUSE_SETXATTR, FUSE_GETXATTR,
49 * FUSE_LISTXATTR, FUSE_REMOVEXATTR, FUSE_OPENDIR, FUSE_READDIR,
50 * FUSE_RELEASEDIR
51 * - add padding to messages to accommodate 32-bit servers on 64-bit kernels
52 *
53 * 7.2:
54 * - add FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE flags
55 * - add FUSE_FSYNCDIR message
56 *
57 * 7.3:
58 * - add FUSE_ACCESS message
59 * - add FUSE_CREATE message
60 * - add filehandle to fuse_setattr_in
61 *
62 * 7.4:
63 * - add frsize to fuse_kstatfs
64 * - clean up request size limit checking
65 *
66 * 7.5:
67 * - add flags and max_write to fuse_init_out
68 *
69 * 7.6:
70 * - add max_readahead to fuse_init_in and fuse_init_out
71 *
72 * 7.7:
73 * - add FUSE_INTERRUPT message
74 * - add POSIX file lock support
75 *
76 * 7.8:
77 * - add lock_owner and flags fields to fuse_release_in
78 * - add FUSE_BMAP message
79 * - add FUSE_DESTROY message
80 *
81 * 7.9:
82 * - new fuse_getattr_in input argument of GETATTR
83 * - add lk_flags in fuse_lk_in
84 * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
85 * - add blksize field to fuse_attr
86 * - add file flags field to fuse_read_in and fuse_write_in
87 * - Add ATIME_NOW and MTIME_NOW flags to fuse_setattr_in
88 *
89 * 7.10
90 * - add nonseekable open flag
91 *
92 * 7.11
93 * - add IOCTL message
94 * - add unsolicited notification support
95 * - add POLL message and NOTIFY_POLL notification
96 *
97 * 7.12
98 * - add umask flag to input argument of create, mknod and mkdir
99 * - add notification messages for invalidation of inodes and
100 * directory entries
101 *
102 * 7.13
103 * - make max number of background requests and congestion threshold
104 * tunables
105 *
106 * 7.14
107 * - add splice support to fuse device
108 *
109 * 7.15
110 * - add store notify
111 * - add retrieve notify
112 *
113 * 7.16
114 * - add BATCH_FORGET request
115 * - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct
116 * fuse_ioctl_iovec' instead of ambiguous 'struct iovec'
117 * - add FUSE_IOCTL_32BIT flag
118 *
119 * 7.17
120 * - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK
121 *
122 * 7.18
123 * - add FUSE_IOCTL_DIR flag
124 * - add FUSE_NOTIFY_DELETE
125 *
126 * 7.19
127 * - add FUSE_FALLOCATE
128 *
129 * 7.20
130 * - add FUSE_AUTO_INVAL_DATA
131 *
132 * 7.21
133 * - add FUSE_READDIRPLUS
134 * - send the requested events in POLL request
135 *
136 * 7.22
137 * - add FUSE_ASYNC_DIO
138 *
139 * 7.23
140 * - add FUSE_WRITEBACK_CACHE
141 * - add time_gran to fuse_init_out
142 * - add reserved space to fuse_init_out
143 * - add FATTR_CTIME
144 * - add ctime and ctimensec to fuse_setattr_in
145 * - add FUSE_RENAME2 request
146 * - add FUSE_NO_OPEN_SUPPORT flag
147 *
148 * 7.24
149 * - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support
150 *
151 * 7.25
152 * - add FUSE_PARALLEL_DIROPS
153 *
154 * 7.26
155 * - add FUSE_HANDLE_KILLPRIV
156 * - add FUSE_POSIX_ACL
157 *
158 * 7.27
159 * - add FUSE_ABORT_ERROR
160 *
161 * 7.28
162 * - add FUSE_COPY_FILE_RANGE
163 * - add FOPEN_CACHE_DIR
164 * - add FUSE_MAX_PAGES, add max_pages to init_out
165 * - add FUSE_CACHE_SYMLINKS
166 */
167
168 #ifndef _FUSE_FUSE_KERNEL_H
169 #define _FUSE_FUSE_KERNEL_H
170
171 #ifdef __linux__
172 #include <linux/types.h>
173 #else
174 #include <sys/types.h>
175 #endif
176
177 /*
178 * Version negotiation:
179 *
180 * Both the kernel and userspace send the version they support in the
181 * INIT request and reply respectively.
182 *
183 * If the major versions match then both shall use the smallest
184 * of the two minor versions for communication.
185 *
186 * If the kernel supports a larger major version, then userspace shall
187 * reply with the major version it supports, ignore the rest of the
188 * INIT message and expect a new INIT message from the kernel with a
189 * matching major version.
190 *
191 * If the library supports a larger major version, then it shall fall
192 * back to the major protocol version sent by the kernel for
193 * communication and reply with that major version (and an arbitrary
194 * supported minor version).
195 */
196
197 /** Version number of this interface */
198 #define FUSE_KERNEL_VERSION 7
199
200 /** Minor version number of this interface */
201 #define FUSE_KERNEL_MINOR_VERSION 29
202
203 /** The node ID of the root inode */
204 #define FUSE_ROOT_ID 1
205
206 /* Make sure all structures are padded to 64bit boundary, so 32bit
207 userspace works under 64bit kernels */
208
209 struct fuse_attr {
210 uint64_t ino;
211 uint64_t size;
212 uint64_t blocks;
213 uint64_t atime;
214 uint64_t mtime;
215 uint64_t ctime;
216 uint32_t atimensec;
217 uint32_t mtimensec;
218 uint32_t ctimensec;
219 uint32_t mode;
220 uint32_t nlink;
221 uint32_t uid;
222 uint32_t gid;
223 uint32_t rdev;
224 uint32_t blksize;
225 uint32_t padding;
226 };
227
228 struct fuse_kstatfs {
229 uint64_t blocks;
230 uint64_t bfree;
231 uint64_t bavail;
232 uint64_t files;
233 uint64_t ffree;
234 uint32_t bsize;
235 uint32_t namelen;
236 uint32_t frsize;
237 uint32_t padding;
238 uint32_t spare[6];
239 };
240
241 struct fuse_file_lock {
242 uint64_t start;
243 uint64_t end;
244 uint32_t type;
245 uint32_t pid; /* tgid */
246 };
247
248 /**
249 * Bitmasks for fuse_setattr_in.valid
250 */
251 #define FATTR_MODE (1 << 0)
252 #define FATTR_UID (1 << 1)
253 #define FATTR_GID (1 << 2)
254 #define FATTR_SIZE (1 << 3)
255 #define FATTR_ATIME (1 << 4)
256 #define FATTR_MTIME (1 << 5)
257 #define FATTR_FH (1 << 6)
258 #define FATTR_ATIME_NOW (1 << 7)
259 #define FATTR_MTIME_NOW (1 << 8)
260 #define FATTR_LOCKOWNER (1 << 9)
261 #define FATTR_CTIME (1 << 10)
262
263 /**
264 * Flags returned by the OPEN request
265 *
266 * FOPEN_DIRECT_IO: bypass page cache for this open file
267 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
268 * FOPEN_NONSEEKABLE: the file is not seekable
269 * FOPEN_CACHE_DIR: allow caching this directory
270 */
271 #define FOPEN_DIRECT_IO (1 << 0)
272 #define FOPEN_KEEP_CACHE (1 << 1)
273 #define FOPEN_NONSEEKABLE (1 << 2)
274 #define FOPEN_CACHE_DIR (1 << 3)
275
276 /**
277 * INIT request/reply flags
278 *
279 * FUSE_ASYNC_READ: asynchronous read requests
280 * FUSE_POSIX_LOCKS: remote locking for POSIX file locks
281 * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported)
282 * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem
283 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
284 * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB
285 * FUSE_DONT_MASK: don't apply umask to file mode on create operations
286 * FUSE_SPLICE_WRITE: kernel supports splice write on the device
287 * FUSE_SPLICE_MOVE: kernel supports splice move on the device
288 * FUSE_SPLICE_READ: kernel supports splice read on the device
289 * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks
290 * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories
291 * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages
292 * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one)
293 * FUSE_READDIRPLUS_AUTO: adaptive readdirplus
294 * FUSE_ASYNC_DIO: asynchronous direct I/O submission
295 * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes
296 * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens
297 * FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir
298 * FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc
299 * FUSE_POSIX_ACL: filesystem supports posix acls
300 * FUSE_ABORT_ERROR: reading the device after abort returns ECONNABORTED
301 * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages
302 * FUSE_CACHE_SYMLINKS: cache READLINK responses
303 * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
304 */
305 #define FUSE_ASYNC_READ (1 << 0)
306 #define FUSE_POSIX_LOCKS (1 << 1)
307 #define FUSE_FILE_OPS (1 << 2)
308 #define FUSE_ATOMIC_O_TRUNC (1 << 3)
309 #define FUSE_EXPORT_SUPPORT (1 << 4)
310 #define FUSE_BIG_WRITES (1 << 5)
311 #define FUSE_DONT_MASK (1 << 6)
312 #define FUSE_SPLICE_WRITE (1 << 7)
313 #define FUSE_SPLICE_MOVE (1 << 8)
314 #define FUSE_SPLICE_READ (1 << 9)
315 #define FUSE_FLOCK_LOCKS (1 << 10)
316 #define FUSE_HAS_IOCTL_DIR (1 << 11)
317 #define FUSE_AUTO_INVAL_DATA (1 << 12)
318 #define FUSE_DO_READDIRPLUS (1 << 13)
319 #define FUSE_READDIRPLUS_AUTO (1 << 14)
320 #define FUSE_ASYNC_DIO (1 << 15)
321 #define FUSE_WRITEBACK_CACHE (1 << 16)
322 #define FUSE_NO_OPEN_SUPPORT (1 << 17)
323 #define FUSE_PARALLEL_DIROPS (1 << 18)
324 #define FUSE_HANDLE_KILLPRIV (1 << 19)
325 #define FUSE_POSIX_ACL (1 << 20)
326 #define FUSE_ABORT_ERROR (1 << 21)
327 #define FUSE_MAX_PAGES (1 << 22)
328 #define FUSE_CACHE_SYMLINKS (1 << 23)
329 #define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
330
331 #ifdef linux
332 /**
333 * CUSE INIT request/reply flags
334 *
335 * CUSE_UNRESTRICTED_IOCTL: use unrestricted ioctl
336 */
337 #define CUSE_UNRESTRICTED_IOCTL (1 << 0)
338 #endif /* linux */
339
340 /**
341 * Release flags
342 */
343 #define FUSE_RELEASE_FLUSH (1 << 0)
344 #define FUSE_RELEASE_FLOCK_UNLOCK (1 << 1)
345
346 /**
347 * Getattr flags
348 */
349 #define FUSE_GETATTR_FH (1 << 0)
350
351 /**
352 * Lock flags
353 */
354 #define FUSE_LK_FLOCK (1 << 0)
355
356 /**
357 * WRITE flags
358 *
359 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
360 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
361 */
362 #define FUSE_WRITE_CACHE (1 << 0)
363 #define FUSE_WRITE_LOCKOWNER (1 << 1)
364
365 /**
366 * Read flags
367 */
368 #define FUSE_READ_LOCKOWNER (1 << 1)
369
370 /**
371 * Ioctl flags
372 *
373 * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
374 * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
375 * FUSE_IOCTL_RETRY: retry with new iovecs
376 * FUSE_IOCTL_32BIT: 32bit ioctl
377 * FUSE_IOCTL_DIR: is a directory
378 *
379 * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
380 */
381 #define FUSE_IOCTL_COMPAT (1 << 0)
382 #define FUSE_IOCTL_UNRESTRICTED (1 << 1)
383 #define FUSE_IOCTL_RETRY (1 << 2)
384 #define FUSE_IOCTL_32BIT (1 << 3)
385 #define FUSE_IOCTL_DIR (1 << 4)
386
387 #define FUSE_IOCTL_MAX_IOV 256
388
389 /**
390 * Poll flags
391 *
392 * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify
393 */
394 #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
395
396 /**
397 * Fsync flags
398 *
399 * FUSE_FSYNC_FDATASYNC: Sync data only, not metadata
400 */
401 #define FUSE_FSYNC_FDATASYNC (1 << 0)
402
403 /**
404 * Fallocate flags.
405 */
406 #define FUSE_FALLOC_FL_KEEP_SIZE 0x1
407 #define FUSE_FALLOC_FL_PUNCH_HOLE 0x2
408
409 enum fuse_opcode {
410 FUSE_LOOKUP = 1,
411 FUSE_FORGET = 2, /* no reply */
412 FUSE_GETATTR = 3,
413 FUSE_SETATTR = 4,
414 FUSE_READLINK = 5,
415 FUSE_SYMLINK = 6,
416 FUSE_MKNOD = 8,
417 FUSE_MKDIR = 9,
418 FUSE_UNLINK = 10,
419 FUSE_RMDIR = 11,
420 FUSE_RENAME = 12,
421 FUSE_LINK = 13,
422 FUSE_OPEN = 14,
423 FUSE_READ = 15,
424 FUSE_WRITE = 16,
425 FUSE_STATFS = 17,
426 FUSE_RELEASE = 18,
427 FUSE_FSYNC = 20,
428 FUSE_SETXATTR = 21,
429 FUSE_GETXATTR = 22,
430 FUSE_LISTXATTR = 23,
431 FUSE_REMOVEXATTR = 24,
432 FUSE_FLUSH = 25,
433 FUSE_INIT = 26,
434 FUSE_OPENDIR = 27,
435 FUSE_READDIR = 28,
436 FUSE_RELEASEDIR = 29,
437 FUSE_FSYNCDIR = 30,
438 FUSE_GETLK = 31,
439 FUSE_SETLK = 32,
440 FUSE_SETLKW = 33,
441 FUSE_ACCESS = 34,
442 FUSE_CREATE = 35,
443 FUSE_INTERRUPT = 36,
444 FUSE_BMAP = 37,
445 FUSE_DESTROY = 38,
446 FUSE_IOCTL = 39,
447 FUSE_POLL = 40,
448 FUSE_NOTIFY_REPLY = 41,
449 FUSE_BATCH_FORGET = 42,
450 FUSE_FALLOCATE = 43,
451 FUSE_READDIRPLUS = 44,
452 FUSE_RENAME2 = 45,
453 FUSE_LSEEK = 46,
454 FUSE_COPY_FILE_RANGE = 47,
455
456 #ifdef linux
457 /* CUSE specific operations */
458 CUSE_INIT = 4096,
459 #endif /* linux */
460 };
461
462 enum fuse_notify_code {
463 FUSE_NOTIFY_POLL = 1,
464 FUSE_NOTIFY_INVAL_INODE = 2,
465 FUSE_NOTIFY_INVAL_ENTRY = 3,
466 FUSE_NOTIFY_STORE = 4,
467 FUSE_NOTIFY_RETRIEVE = 5,
468 FUSE_NOTIFY_DELETE = 6,
469 FUSE_NOTIFY_CODE_MAX,
470 };
471
472 /* The read buffer is required to be at least 8k, but may be much larger */
473 #define FUSE_MIN_READ_BUFFER 8192
474
475 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
476
477 struct fuse_entry_out {
478 uint64_t nodeid; /* Inode ID */
479 uint64_t generation; /* Inode generation: nodeid:gen must
480 be unique for the fs's lifetime */
481 uint64_t entry_valid; /* Cache timeout for the name */
482 uint64_t attr_valid; /* Cache timeout for the attributes */
483 uint32_t entry_valid_nsec;
484 uint32_t attr_valid_nsec;
485 struct fuse_attr attr;
486 };
487
488 struct fuse_forget_in {
489 uint64_t nlookup;
490 };
491
492 struct fuse_forget_one {
493 uint64_t nodeid;
494 uint64_t nlookup;
495 };
496
497 struct fuse_batch_forget_in {
498 uint32_t count;
499 uint32_t dummy;
500 };
501
502 struct fuse_getattr_in {
503 uint32_t getattr_flags;
504 uint32_t dummy;
505 uint64_t fh;
506 };
507
508 #define FUSE_COMPAT_ATTR_OUT_SIZE 96
509
510 struct fuse_attr_out {
511 uint64_t attr_valid; /* Cache timeout for the attributes */
512 uint32_t attr_valid_nsec;
513 uint32_t dummy;
514 struct fuse_attr attr;
515 };
516
517 #define FUSE_COMPAT_MKNOD_IN_SIZE 8
518
519 struct fuse_mknod_in {
520 uint32_t mode;
521 uint32_t rdev;
522 uint32_t umask;
523 uint32_t padding;
524 };
525
526 struct fuse_mkdir_in {
527 uint32_t mode;
528 uint32_t umask;
529 };
530
531 struct fuse_rename_in {
532 uint64_t newdir;
533 };
534
535 struct fuse_rename2_in {
536 uint64_t newdir;
537 uint32_t flags;
538 uint32_t padding;
539 };
540
541 struct fuse_link_in {
542 uint64_t oldnodeid;
543 };
544
545 struct fuse_setattr_in {
546 uint32_t valid;
547 uint32_t padding;
548 uint64_t fh;
549 uint64_t size;
550 uint64_t lock_owner;
551 uint64_t atime;
552 uint64_t mtime;
553 uint64_t ctime;
554 uint32_t atimensec;
555 uint32_t mtimensec;
556 uint32_t ctimensec;
557 uint32_t mode;
558 uint32_t unused4;
559 uint32_t uid;
560 uint32_t gid;
561 uint32_t unused5;
562 };
563
564 struct fuse_open_in {
565 uint32_t flags;
566 uint32_t unused;
567 };
568
569 struct fuse_create_in {
570 uint32_t flags;
571 uint32_t mode;
572 uint32_t umask;
573 uint32_t padding;
574 };
575
576 struct fuse_open_out {
577 uint64_t fh;
578 uint32_t open_flags;
579 uint32_t padding;
580 };
581
582 struct fuse_release_in {
583 uint64_t fh;
584 uint32_t flags;
585 uint32_t release_flags;
586 uint64_t lock_owner;
587 };
588
589 struct fuse_flush_in {
590 uint64_t fh;
591 uint32_t unused;
592 uint32_t padding;
593 uint64_t lock_owner;
594 };
595
596 struct fuse_read_in {
597 uint64_t fh;
598 uint64_t offset;
599 uint32_t size;
600 uint32_t read_flags;
601 uint64_t lock_owner;
602 uint32_t flags;
603 uint32_t padding;
604 };
605
606 #define FUSE_COMPAT_WRITE_IN_SIZE 24
607
608 struct fuse_write_in {
609 uint64_t fh;
610 uint64_t offset;
611 uint32_t size;
612 uint32_t write_flags;
613 uint64_t lock_owner;
614 uint32_t flags;
615 uint32_t padding;
616 };
617
618 struct fuse_write_out {
619 uint32_t size;
620 uint32_t padding;
621 };
622
623 #define FUSE_COMPAT_STATFS_SIZE 48
624
625 struct fuse_statfs_out {
626 struct fuse_kstatfs st;
627 };
628
629 struct fuse_fsync_in {
630 uint64_t fh;
631 uint32_t fsync_flags;
632 uint32_t padding;
633 };
634
635 struct fuse_setxattr_in {
636 uint32_t size;
637 uint32_t flags;
638 };
639
640 struct fuse_listxattr_in {
641 uint32_t size;
642 uint32_t padding;
643 };
644
645 struct fuse_listxattr_out {
646 uint32_t size;
647 uint32_t padding;
648 };
649
650 struct fuse_getxattr_in {
651 uint32_t size;
652 uint32_t padding;
653 };
654
655 struct fuse_getxattr_out {
656 uint32_t size;
657 uint32_t padding;
658 };
659
660 struct fuse_lk_in {
661 uint64_t fh;
662 uint64_t owner;
663 struct fuse_file_lock lk;
664 uint32_t lk_flags;
665 uint32_t padding;
666 };
667
668 struct fuse_lk_out {
669 struct fuse_file_lock lk;
670 };
671
672 struct fuse_access_in {
673 uint32_t mask;
674 uint32_t padding;
675 };
676
677 struct fuse_init_in {
678 uint32_t major;
679 uint32_t minor;
680 uint32_t max_readahead;
681 uint32_t flags;
682 };
683
684 #define FUSE_COMPAT_INIT_OUT_SIZE 8
685 #define FUSE_COMPAT_22_INIT_OUT_SIZE 24
686
687 struct fuse_init_out {
688 uint32_t major;
689 uint32_t minor;
690 uint32_t max_readahead;
691 uint32_t flags;
692 uint16_t max_background;
693 uint16_t congestion_threshold;
694 uint32_t max_write;
695 uint32_t time_gran;
696 uint16_t max_pages;
697 uint16_t padding;
698 uint32_t unused[8];
699 };
700
701 #ifdef linux
702 #define CUSE_INIT_INFO_MAX 4096
703
704 struct cuse_init_in {
705 uint32_t major;
706 uint32_t minor;
707 uint32_t unused;
708 uint32_t flags;
709 };
710
711 struct cuse_init_out {
712 uint32_t major;
713 uint32_t minor;
714 uint32_t unused;
715 uint32_t flags;
716 uint32_t max_read;
717 uint32_t max_write;
718 uint32_t dev_major; /* chardev major */
719 uint32_t dev_minor; /* chardev minor */
720 uint32_t spare[10];
721 };
722 #endif /* linux */
723
724 struct fuse_interrupt_in {
725 uint64_t unique;
726 };
727
728 struct fuse_bmap_in {
729 uint64_t block;
730 uint32_t blocksize;
731 uint32_t padding;
732 };
733
734 struct fuse_bmap_out {
735 uint64_t block;
736 };
737
738 struct fuse_ioctl_in {
739 uint64_t fh;
740 uint32_t flags;
741 uint32_t cmd;
742 uint64_t arg;
743 uint32_t in_size;
744 uint32_t out_size;
745 };
746
747 struct fuse_ioctl_iovec {
748 uint64_t base;
749 uint64_t len;
750 };
751
752 struct fuse_ioctl_out {
753 int32_t result;
754 uint32_t flags;
755 uint32_t in_iovs;
756 uint32_t out_iovs;
757 };
758
759 struct fuse_poll_in {
760 uint64_t fh;
761 uint64_t kh;
762 uint32_t flags;
763 uint32_t events;
764 };
765
766 struct fuse_poll_out {
767 uint32_t revents;
768 uint32_t padding;
769 };
770
771 struct fuse_notify_poll_wakeup_out {
772 uint64_t kh;
773 };
774
775 struct fuse_fallocate_in {
776 uint64_t fh;
777 uint64_t offset;
778 uint64_t length;
779 uint32_t mode;
780 uint32_t padding;
781 };
782
783 struct fuse_in_header {
784 uint32_t len;
785 uint32_t opcode;
786 uint64_t unique;
787 uint64_t nodeid;
788 uint32_t uid;
789 uint32_t gid;
790 uint32_t pid;
791 uint32_t padding;
792 };
793
794 struct fuse_out_header {
795 uint32_t len;
796 int32_t error;
797 uint64_t unique;
798 };
799
800 struct fuse_dirent {
801 uint64_t ino;
802 uint64_t off;
803 uint32_t namelen;
804 uint32_t type;
805 char name[];
806 };
807
808 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
809 #define FUSE_DIRENT_ALIGN(x) \
810 (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
811 #define FUSE_DIRENT_SIZE(d) \
812 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
813
814 struct fuse_direntplus {
815 struct fuse_entry_out entry_out;
816 struct fuse_dirent dirent;
817 };
818
819 #define FUSE_NAME_OFFSET_DIRENTPLUS \
820 offsetof(struct fuse_direntplus, dirent.name)
821 #define FUSE_DIRENTPLUS_SIZE(d) \
822 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
823
824 struct fuse_notify_inval_inode_out {
825 uint64_t ino;
826 int64_t off;
827 int64_t len;
828 };
829
830 struct fuse_notify_inval_entry_out {
831 uint64_t parent;
832 uint32_t namelen;
833 uint32_t padding;
834 };
835
836 struct fuse_notify_delete_out {
837 uint64_t parent;
838 uint64_t child;
839 uint32_t namelen;
840 uint32_t padding;
841 };
842
843 struct fuse_notify_store_out {
844 uint64_t nodeid;
845 uint64_t offset;
846 uint32_t size;
847 uint32_t padding;
848 };
849
850 struct fuse_notify_retrieve_out {
851 uint64_t notify_unique;
852 uint64_t nodeid;
853 uint64_t offset;
854 uint32_t size;
855 uint32_t padding;
856 };
857
858 /* Matches the size of fuse_write_in */
859 struct fuse_notify_retrieve_in {
860 uint64_t dummy1;
861 uint64_t offset;
862 uint32_t size;
863 uint32_t dummy2;
864 uint64_t dummy3;
865 uint64_t dummy4;
866 };
867
868 struct fuse_lseek_in {
869 uint64_t fh;
870 uint64_t offset;
871 uint32_t whence;
872 uint32_t padding;
873 };
874
875 struct fuse_lseek_out {
876 uint64_t offset;
877 };
878
879 struct fuse_copy_file_range_in {
880 uint64_t fh_in;
881 uint64_t off_in;
882 uint64_t nodeid_out;
883 uint64_t fh_out;
884 uint64_t off_out;
885 uint64_t len;
886 uint64_t flags;
887 };
888
889 #endif /* _FUSE_FUSE_KERNEL_H */
Cache object: 5fdacff709c6389e4fe9c16a9e0f5a87
|