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