libfuse
fuse_kernel.h
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  * This file defines the kernel interface of FUSE
38  *
39  * Protocol changelog:
40  *
41  * 7.9:
42  * - new fuse_getattr_in input argument of GETATTR
43  * - add lk_flags in fuse_lk_in
44  * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
45  * - add blksize field to fuse_attr
46  * - add file flags field to fuse_read_in and fuse_write_in
47  * - Add ATIME_NOW and MTIME_NOW flags to fuse_setattr_in
48  *
49  * 7.10
50  * - add nonseekable open flag
51  *
52  * 7.11
53  * - add IOCTL message
54  * - add unsolicited notification support
55  * - add POLL message and NOTIFY_POLL notification
56  *
57  * 7.12
58  * - add umask flag to input argument of create, mknod and mkdir
59  * - add notification messages for invalidation of inodes and
60  * directory entries
61  *
62  * 7.13
63  * - make max number of background requests and congestion threshold
64  * tunables
65  *
66  * 7.14
67  * - add splice support to fuse device
68  *
69  * 7.15
70  * - add store notify
71  * - add retrieve notify
72  *
73  * 7.16
74  * - add BATCH_FORGET request
75  * - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct
76  * fuse_ioctl_iovec' instead of ambiguous 'struct iovec'
77  * - add FUSE_IOCTL_32BIT flag
78  *
79  * 7.17
80  * - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK
81  *
82  * 7.18
83  * - add FUSE_IOCTL_DIR flag
84  * - add FUSE_NOTIFY_DELETE
85  *
86  * 7.19
87  * - add FUSE_FALLOCATE
88  *
89  * 7.20
90  * - add FUSE_AUTO_INVAL_DATA
91  *
92  * 7.21
93  * - add FUSE_READDIRPLUS
94  * - send the requested events in POLL request
95  *
96  * 7.22
97  * - add FUSE_ASYNC_DIO
98  *
99  * 7.23
100  * - add FUSE_WRITEBACK_CACHE
101  * - add time_gran to fuse_init_out
102  * - add reserved space to fuse_init_out
103  * - add FATTR_CTIME
104  * - add ctime and ctimensec to fuse_setattr_in
105  * - add FUSE_RENAME2 request
106  * - add FUSE_NO_OPEN_SUPPORT flag
107  *
108  * 7.24
109  * - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support
110  *
111  * 7.25
112  * - add FUSE_PARALLEL_DIROPS
113  *
114  * 7.26
115  * - add FUSE_HANDLE_KILLPRIV
116  * - add FUSE_POSIX_ACL
117  *
118  * 7.27
119  * - add FUSE_ABORT_ERROR
120  *
121  * 7.28
122  * - add FUSE_COPY_FILE_RANGE
123  * - add FOPEN_CACHE_DIR
124  * - add FUSE_MAX_PAGES, add max_pages to init_out
125  * - add FUSE_CACHE_SYMLINKS
126  *
127  * 7.29
128  * - add FUSE_NO_OPENDIR_SUPPORT flag
129  *
130  * 7.30
131  * - add FUSE_EXPLICIT_INVAL_DATA
132  * - add FUSE_IOCTL_COMPAT_X32
133  *
134  * 7.31
135  * - add FUSE_WRITE_KILL_PRIV flag
136  */
137 
138 #ifndef _LINUX_FUSE_H
139 #define _LINUX_FUSE_H
140 
141 #ifdef __KERNEL__
142 #include <linux/types.h>
143 #else
144 #include <stdint.h>
145 #endif
146 
147 /*
148  * Version negotiation:
149  *
150  * Both the kernel and userspace send the version they support in the
151  * INIT request and reply respectively.
152  *
153  * If the major versions match then both shall use the smallest
154  * of the two minor versions for communication.
155  *
156  * If the kernel supports a larger major version, then userspace shall
157  * reply with the major version it supports, ignore the rest of the
158  * INIT message and expect a new INIT message from the kernel with a
159  * matching major version.
160  *
161  * If the library supports a larger major version, then it shall fall
162  * back to the major protocol version sent by the kernel for
163  * communication and reply with that major version (and an arbitrary
164  * supported minor version).
165  */
166 
168 #define FUSE_KERNEL_VERSION 7
169 
171 #define FUSE_KERNEL_MINOR_VERSION 31
172 
174 #define FUSE_ROOT_ID 1
175 
176 /* Make sure all structures are padded to 64bit boundary, so 32bit
177  userspace works under 64bit kernels */
178 
179 struct fuse_attr {
180  uint64_t ino;
181  uint64_t size;
182  uint64_t blocks;
183  uint64_t atime;
184  uint64_t mtime;
185  uint64_t ctime;
186  uint32_t atimensec;
187  uint32_t mtimensec;
188  uint32_t ctimensec;
189  uint32_t mode;
190  uint32_t nlink;
191  uint32_t uid;
192  uint32_t gid;
193  uint32_t rdev;
194  uint32_t blksize;
195  uint32_t padding;
196 };
197 
198 struct fuse_kstatfs {
199  uint64_t blocks;
200  uint64_t bfree;
201  uint64_t bavail;
202  uint64_t files;
203  uint64_t ffree;
204  uint32_t bsize;
205  uint32_t namelen;
206  uint32_t frsize;
207  uint32_t padding;
208  uint32_t spare[6];
209 };
210 
211 struct fuse_file_lock {
212  uint64_t start;
213  uint64_t end;
214  uint32_t type;
215  uint32_t pid; /* tgid */
216 };
217 
221 #define FATTR_MODE (1 << 0)
222 #define FATTR_UID (1 << 1)
223 #define FATTR_GID (1 << 2)
224 #define FATTR_SIZE (1 << 3)
225 #define FATTR_ATIME (1 << 4)
226 #define FATTR_MTIME (1 << 5)
227 #define FATTR_FH (1 << 6)
228 #define FATTR_ATIME_NOW (1 << 7)
229 #define FATTR_MTIME_NOW (1 << 8)
230 #define FATTR_LOCKOWNER (1 << 9)
231 #define FATTR_CTIME (1 << 10)
232 
244 #define FOPEN_DIRECT_IO (1 << 0)
245 #define FOPEN_KEEP_CACHE (1 << 1)
246 #define FOPEN_NONSEEKABLE (1 << 2)
247 #define FOPEN_CACHE_DIR (1 << 3)
248 #define FOPEN_STREAM (1 << 4)
249 #define FOPEN_NOFLUSH (1 << 5)
250 #define FOPEN_PARALLEL_DIRECT_WRITES (1 << 6)
281 #define FUSE_ASYNC_READ (1 << 0)
282 #define FUSE_POSIX_LOCKS (1 << 1)
283 #define FUSE_FILE_OPS (1 << 2)
284 #define FUSE_ATOMIC_O_TRUNC (1 << 3)
285 #define FUSE_EXPORT_SUPPORT (1 << 4)
286 #define FUSE_BIG_WRITES (1 << 5)
287 #define FUSE_DONT_MASK (1 << 6)
288 #define FUSE_SPLICE_WRITE (1 << 7)
289 #define FUSE_SPLICE_MOVE (1 << 8)
290 #define FUSE_SPLICE_READ (1 << 9)
291 #define FUSE_FLOCK_LOCKS (1 << 10)
292 #define FUSE_HAS_IOCTL_DIR (1 << 11)
293 #define FUSE_AUTO_INVAL_DATA (1 << 12)
294 #define FUSE_DO_READDIRPLUS (1 << 13)
295 #define FUSE_READDIRPLUS_AUTO (1 << 14)
296 #define FUSE_ASYNC_DIO (1 << 15)
297 #define FUSE_WRITEBACK_CACHE (1 << 16)
298 #define FUSE_NO_OPEN_SUPPORT (1 << 17)
299 #define FUSE_PARALLEL_DIROPS (1 << 18)
300 #define FUSE_HANDLE_KILLPRIV (1 << 19)
301 #define FUSE_POSIX_ACL (1 << 20)
302 #define FUSE_ABORT_ERROR (1 << 21)
303 #define FUSE_MAX_PAGES (1 << 22)
304 #define FUSE_CACHE_SYMLINKS (1 << 23)
305 #define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
306 #define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
307 #define FUSE_MAP_ALIGNMENT (1 << 26)
308 #define FUSE_SUBMOUNTS (1 << 27)
309 #define FUSE_HANDLE_KILLPRIV_V2 (1 << 28)
310 #define FUSE_SETXATTR_EXT (1 << 29)
311 #define FUSE_INIT_EXT (1 << 30)
312 #define FUSE_INIT_RESERVED (1 << 31)
313 /* bits 32..63 get shifted down 32 bits into the flags2 field */
314 #define FUSE_SECURITY_CTX (1ULL << 32)
315 #define FUSE_HAS_INODE_DAX (1ULL << 33)
316 
322 #define CUSE_UNRESTRICTED_IOCTL (1 << 0)
323 
327 #define FUSE_RELEASE_FLUSH (1 << 0)
328 #define FUSE_RELEASE_FLOCK_UNLOCK (1 << 1)
329 
333 #define FUSE_GETATTR_FH (1 << 0)
334 
338 #define FUSE_LK_FLOCK (1 << 0)
339 
347 #define FUSE_WRITE_CACHE (1 << 0)
348 #define FUSE_WRITE_LOCKOWNER (1 << 1)
349 #define FUSE_WRITE_KILL_PRIV (1 << 2)
350 
354 #define FUSE_READ_LOCKOWNER (1 << 1)
355 
368 #define FUSE_IOCTL_COMPAT (1 << 0)
369 #define FUSE_IOCTL_UNRESTRICTED (1 << 1)
370 #define FUSE_IOCTL_RETRY (1 << 2)
371 #define FUSE_IOCTL_32BIT (1 << 3)
372 #define FUSE_IOCTL_DIR (1 << 4)
373 #define FUSE_IOCTL_COMPAT_X32 (1 << 5)
374 
375 #define FUSE_IOCTL_MAX_IOV 256
376 
382 #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
383 
389 #define FUSE_FSYNC_FDATASYNC (1 << 0)
390 
395 #define FUSE_EXPIRE_ONLY (1 << 0)
396 
397 enum fuse_opcode {
398  FUSE_LOOKUP = 1,
399  FUSE_FORGET = 2, /* no reply */
400  FUSE_GETATTR = 3,
401  FUSE_SETATTR = 4,
402  FUSE_READLINK = 5,
403  FUSE_SYMLINK = 6,
404  FUSE_MKNOD = 8,
405  FUSE_MKDIR = 9,
406  FUSE_UNLINK = 10,
407  FUSE_RMDIR = 11,
408  FUSE_RENAME = 12,
409  FUSE_LINK = 13,
410  FUSE_OPEN = 14,
411  FUSE_READ = 15,
412  FUSE_WRITE = 16,
413  FUSE_STATFS = 17,
414  FUSE_RELEASE = 18,
415  FUSE_FSYNC = 20,
416  FUSE_SETXATTR = 21,
417  FUSE_GETXATTR = 22,
418  FUSE_LISTXATTR = 23,
419  FUSE_REMOVEXATTR = 24,
420  FUSE_FLUSH = 25,
421  FUSE_INIT = 26,
422  FUSE_OPENDIR = 27,
423  FUSE_READDIR = 28,
424  FUSE_RELEASEDIR = 29,
425  FUSE_FSYNCDIR = 30,
426  FUSE_GETLK = 31,
427  FUSE_SETLK = 32,
428  FUSE_SETLKW = 33,
429  FUSE_ACCESS = 34,
430  FUSE_CREATE = 35,
431  FUSE_INTERRUPT = 36,
432  FUSE_BMAP = 37,
433  FUSE_DESTROY = 38,
434  FUSE_IOCTL = 39,
435  FUSE_POLL = 40,
436  FUSE_NOTIFY_REPLY = 41,
437  FUSE_BATCH_FORGET = 42,
438  FUSE_FALLOCATE = 43,
439  FUSE_READDIRPLUS = 44,
440  FUSE_RENAME2 = 45,
441  FUSE_LSEEK = 46,
442  FUSE_COPY_FILE_RANGE = 47,
443 
444  /* CUSE specific operations */
445  CUSE_INIT = 4096
446 };
447 
448 enum fuse_notify_code {
449  FUSE_NOTIFY_POLL = 1,
450  FUSE_NOTIFY_INVAL_INODE = 2,
451  FUSE_NOTIFY_INVAL_ENTRY = 3,
452  FUSE_NOTIFY_STORE = 4,
453  FUSE_NOTIFY_RETRIEVE = 5,
454  FUSE_NOTIFY_DELETE = 6,
455  FUSE_NOTIFY_CODE_MAX
456 };
457 
458 /* The read buffer is required to be at least 8k, but may be much larger */
459 #define FUSE_MIN_READ_BUFFER 8192
460 
461 #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
462 
463 struct fuse_entry_out {
464  uint64_t nodeid; /* Inode ID */
465  uint64_t generation; /* Inode generation: nodeid:gen must
466  be unique for the fs's lifetime */
467  uint64_t entry_valid; /* Cache timeout for the name */
468  uint64_t attr_valid; /* Cache timeout for the attributes */
469  uint32_t entry_valid_nsec;
470  uint32_t attr_valid_nsec;
471  struct fuse_attr attr;
472 };
473 
474 struct fuse_forget_in {
475  uint64_t nlookup;
476 };
477 
478 struct fuse_forget_one {
479  uint64_t nodeid;
480  uint64_t nlookup;
481 };
482 
483 struct fuse_batch_forget_in {
484  uint32_t count;
485  uint32_t dummy;
486 };
487 
488 struct fuse_getattr_in {
489  uint32_t getattr_flags;
490  uint32_t dummy;
491  uint64_t fh;
492 };
493 
494 #define FUSE_COMPAT_ATTR_OUT_SIZE 96
495 
496 struct fuse_attr_out {
497  uint64_t attr_valid; /* Cache timeout for the attributes */
498  uint32_t attr_valid_nsec;
499  uint32_t dummy;
500  struct fuse_attr attr;
501 };
502 
503 #define FUSE_COMPAT_MKNOD_IN_SIZE 8
504 
505 struct fuse_mknod_in {
506  uint32_t mode;
507  uint32_t rdev;
508  uint32_t umask;
509  uint32_t padding;
510 };
511 
512 struct fuse_mkdir_in {
513  uint32_t mode;
514  uint32_t umask;
515 };
516 
517 struct fuse_rename_in {
518  uint64_t newdir;
519 };
520 
521 struct fuse_rename2_in {
522  uint64_t newdir;
523  uint32_t flags;
524  uint32_t padding;
525 };
526 
527 struct fuse_link_in {
528  uint64_t oldnodeid;
529 };
530 
531 struct fuse_setattr_in {
532  uint32_t valid;
533  uint32_t padding;
534  uint64_t fh;
535  uint64_t size;
536  uint64_t lock_owner;
537  uint64_t atime;
538  uint64_t mtime;
539  uint64_t ctime;
540  uint32_t atimensec;
541  uint32_t mtimensec;
542  uint32_t ctimensec;
543  uint32_t mode;
544  uint32_t unused4;
545  uint32_t uid;
546  uint32_t gid;
547  uint32_t unused5;
548 };
549 
550 struct fuse_open_in {
551  uint32_t flags;
552  uint32_t unused;
553 };
554 
555 struct fuse_create_in {
556  uint32_t flags;
557  uint32_t mode;
558  uint32_t umask;
559  uint32_t padding;
560 };
561 
562 struct fuse_open_out {
563  uint64_t fh;
564  uint32_t open_flags;
565  uint32_t padding;
566 };
567 
568 struct fuse_release_in {
569  uint64_t fh;
570  uint32_t flags;
571  uint32_t release_flags;
572  uint64_t lock_owner;
573 };
574 
575 struct fuse_flush_in {
576  uint64_t fh;
577  uint32_t unused;
578  uint32_t padding;
579  uint64_t lock_owner;
580 };
581 
582 struct fuse_read_in {
583  uint64_t fh;
584  uint64_t offset;
585  uint32_t size;
586  uint32_t read_flags;
587  uint64_t lock_owner;
588  uint32_t flags;
589  uint32_t padding;
590 };
591 
592 #define FUSE_COMPAT_WRITE_IN_SIZE 24
593 
594 struct fuse_write_in {
595  uint64_t fh;
596  uint64_t offset;
597  uint32_t size;
598  uint32_t write_flags;
599  uint64_t lock_owner;
600  uint32_t flags;
601  uint32_t padding;
602 };
603 
604 struct fuse_write_out {
605  uint32_t size;
606  uint32_t padding;
607 };
608 
609 #define FUSE_COMPAT_STATFS_SIZE 48
610 
611 struct fuse_statfs_out {
612  struct fuse_kstatfs st;
613 };
614 
615 struct fuse_fsync_in {
616  uint64_t fh;
617  uint32_t fsync_flags;
618  uint32_t padding;
619 };
620 
621 struct fuse_setxattr_in {
622  uint32_t size;
623  uint32_t flags;
624 };
625 
626 struct fuse_getxattr_in {
627  uint32_t size;
628  uint32_t padding;
629 };
630 
631 struct fuse_getxattr_out {
632  uint32_t size;
633  uint32_t padding;
634 };
635 
636 struct fuse_lk_in {
637  uint64_t fh;
638  uint64_t owner;
639  struct fuse_file_lock lk;
640  uint32_t lk_flags;
641  uint32_t padding;
642 };
643 
644 struct fuse_lk_out {
645  struct fuse_file_lock lk;
646 };
647 
648 struct fuse_access_in {
649  uint32_t mask;
650  uint32_t padding;
651 };
652 
653 struct fuse_init_in {
654  uint32_t major;
655  uint32_t minor;
656  uint32_t max_readahead;
657  uint32_t flags;
658  uint32_t flags2;
659  uint32_t unused[11];
660 };
661 
662 #define FUSE_COMPAT_INIT_OUT_SIZE 8
663 #define FUSE_COMPAT_22_INIT_OUT_SIZE 24
664 
665 struct fuse_init_out {
666  uint32_t major;
667  uint32_t minor;
668  uint32_t max_readahead;
669  uint32_t flags;
670  uint16_t max_background;
671  uint16_t congestion_threshold;
672  uint32_t max_write;
673  uint32_t time_gran;
674  uint16_t max_pages;
675  uint16_t map_alignment;
676  uint32_t flags2;
677  uint32_t unused[7];
678 };
679 
680 #define CUSE_INIT_INFO_MAX 4096
681 
682 struct cuse_init_in {
683  uint32_t major;
684  uint32_t minor;
685  uint32_t unused;
686  uint32_t flags;
687 };
688 
689 struct cuse_init_out {
690  uint32_t major;
691  uint32_t minor;
692  uint32_t unused;
693  uint32_t flags;
694  uint32_t max_read;
695  uint32_t max_write;
696  uint32_t dev_major; /* chardev major */
697  uint32_t dev_minor; /* chardev minor */
698  uint32_t spare[10];
699 };
700 
701 struct fuse_interrupt_in {
702  uint64_t unique;
703 };
704 
705 struct fuse_bmap_in {
706  uint64_t block;
707  uint32_t blocksize;
708  uint32_t padding;
709 };
710 
711 struct fuse_bmap_out {
712  uint64_t block;
713 };
714 
715 struct fuse_ioctl_in {
716  uint64_t fh;
717  uint32_t flags;
718  uint32_t cmd;
719  uint64_t arg;
720  uint32_t in_size;
721  uint32_t out_size;
722 };
723 
724 struct fuse_ioctl_iovec {
725  uint64_t base;
726  uint64_t len;
727 };
728 
729 struct fuse_ioctl_out {
730  int32_t result;
731  uint32_t flags;
732  uint32_t in_iovs;
733  uint32_t out_iovs;
734 };
735 
736 struct fuse_poll_in {
737  uint64_t fh;
738  uint64_t kh;
739  uint32_t flags;
740  uint32_t events;
741 };
742 
743 struct fuse_poll_out {
744  uint32_t revents;
745  uint32_t padding;
746 };
747 
748 struct fuse_notify_poll_wakeup_out {
749  uint64_t kh;
750 };
751 
752 struct fuse_fallocate_in {
753  uint64_t fh;
754  uint64_t offset;
755  uint64_t length;
756  uint32_t mode;
757  uint32_t padding;
758 };
759 
760 struct fuse_in_header {
761  uint32_t len;
762  uint32_t opcode;
763  uint64_t unique;
764  uint64_t nodeid;
765  uint32_t uid;
766  uint32_t gid;
767  uint32_t pid;
768  uint32_t padding;
769 };
770 
771 struct fuse_out_header {
772  uint32_t len;
773  int32_t error;
774  uint64_t unique;
775 };
776 
777 struct fuse_dirent {
778  uint64_t ino;
779  uint64_t off;
780  uint32_t namelen;
781  uint32_t type;
782  char name[];
783 };
784 
785 #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
786 #define FUSE_DIRENT_ALIGN(x) \
787  (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
788 #define FUSE_DIRENT_SIZE(d) \
789  FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
790 
791 struct fuse_direntplus {
792  struct fuse_entry_out entry_out;
793  struct fuse_dirent dirent;
794 };
795 
796 #define FUSE_NAME_OFFSET_DIRENTPLUS \
797  offsetof(struct fuse_direntplus, dirent.name)
798 #define FUSE_DIRENTPLUS_SIZE(d) \
799  FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
800 
801 struct fuse_notify_inval_inode_out {
802  uint64_t ino;
803  int64_t off;
804  int64_t len;
805 };
806 
807 struct fuse_notify_inval_entry_out {
808  uint64_t parent;
809  uint32_t namelen;
810  uint32_t flags;
811 };
812 
813 struct fuse_notify_delete_out {
814  uint64_t parent;
815  uint64_t child;
816  uint32_t namelen;
817  uint32_t padding;
818 };
819 
820 struct fuse_notify_store_out {
821  uint64_t nodeid;
822  uint64_t offset;
823  uint32_t size;
824  uint32_t padding;
825 };
826 
827 struct fuse_notify_retrieve_out {
828  uint64_t notify_unique;
829  uint64_t nodeid;
830  uint64_t offset;
831  uint32_t size;
832  uint32_t padding;
833 };
834 
835 /* Matches the size of fuse_write_in */
836 struct fuse_notify_retrieve_in {
837  uint64_t dummy1;
838  uint64_t offset;
839  uint32_t size;
840  uint32_t dummy2;
841  uint64_t dummy3;
842  uint64_t dummy4;
843 };
844 
845 /* Device ioctls: */
846 #define FUSE_DEV_IOC_CLONE _IOR(229, 0, uint32_t)
847 
848 struct fuse_lseek_in {
849  uint64_t fh;
850  uint64_t offset;
851  uint32_t whence;
852  uint32_t padding;
853 };
854 
855 struct fuse_lseek_out {
856  uint64_t offset;
857 };
858 
859 struct fuse_copy_file_range_in {
860  uint64_t fh_in;
861  uint64_t off_in;
862  uint64_t nodeid_out;
863  uint64_t fh_out;
864  uint64_t off_out;
865  uint64_t len;
866  uint64_t flags;
867 };
868 
869 #endif /* _LINUX_FUSE_H */