1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189#ifndef _LINUX_FUSE_H
190#define _LINUX_FUSE_H
191
192#ifdef __KERNEL__
193#include <linux/types.h>
194#else
195#include <stdint.h>
196#endif
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219#define FUSE_KERNEL_VERSION 7
220
221
222#define FUSE_KERNEL_MINOR_VERSION 34
223
224
225#define FUSE_ROOT_ID 1
226
227
228
229
230struct fuse_attr {
231 uint64_t ino;
232 uint64_t size;
233 uint64_t blocks;
234 uint64_t atime;
235 uint64_t mtime;
236 uint64_t ctime;
237 uint32_t atimensec;
238 uint32_t mtimensec;
239 uint32_t ctimensec;
240 uint32_t mode;
241 uint32_t nlink;
242 uint32_t uid;
243 uint32_t gid;
244 uint32_t rdev;
245 uint32_t blksize;
246 uint32_t flags;
247};
248
249struct fuse_kstatfs {
250 uint64_t blocks;
251 uint64_t bfree;
252 uint64_t bavail;
253 uint64_t files;
254 uint64_t ffree;
255 uint32_t bsize;
256 uint32_t namelen;
257 uint32_t frsize;
258 uint32_t padding;
259 uint32_t spare[6];
260};
261
262struct fuse_file_lock {
263 uint64_t start;
264 uint64_t end;
265 uint32_t type;
266 uint32_t pid;
267};
268
269
270
271
272#define FATTR_MODE (1 << 0)
273#define FATTR_UID (1 << 1)
274#define FATTR_GID (1 << 2)
275#define FATTR_SIZE (1 << 3)
276#define FATTR_ATIME (1 << 4)
277#define FATTR_MTIME (1 << 5)
278#define FATTR_FH (1 << 6)
279#define FATTR_ATIME_NOW (1 << 7)
280#define FATTR_MTIME_NOW (1 << 8)
281#define FATTR_LOCKOWNER (1 << 9)
282#define FATTR_CTIME (1 << 10)
283#define FATTR_KILL_SUIDGID (1 << 11)
284
285
286
287
288
289
290
291
292
293
294#define FOPEN_DIRECT_IO (1 << 0)
295#define FOPEN_KEEP_CACHE (1 << 1)
296#define FOPEN_NONSEEKABLE (1 << 2)
297#define FOPEN_CACHE_DIR (1 << 3)
298#define FOPEN_STREAM (1 << 4)
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340#define FUSE_ASYNC_READ (1 << 0)
341#define FUSE_POSIX_LOCKS (1 << 1)
342#define FUSE_FILE_OPS (1 << 2)
343#define FUSE_ATOMIC_O_TRUNC (1 << 3)
344#define FUSE_EXPORT_SUPPORT (1 << 4)
345#define FUSE_BIG_WRITES (1 << 5)
346#define FUSE_DONT_MASK (1 << 6)
347#define FUSE_SPLICE_WRITE (1 << 7)
348#define FUSE_SPLICE_MOVE (1 << 8)
349#define FUSE_SPLICE_READ (1 << 9)
350#define FUSE_FLOCK_LOCKS (1 << 10)
351#define FUSE_HAS_IOCTL_DIR (1 << 11)
352#define FUSE_AUTO_INVAL_DATA (1 << 12)
353#define FUSE_DO_READDIRPLUS (1 << 13)
354#define FUSE_READDIRPLUS_AUTO (1 << 14)
355#define FUSE_ASYNC_DIO (1 << 15)
356#define FUSE_WRITEBACK_CACHE (1 << 16)
357#define FUSE_NO_OPEN_SUPPORT (1 << 17)
358#define FUSE_PARALLEL_DIROPS (1 << 18)
359#define FUSE_HANDLE_KILLPRIV (1 << 19)
360#define FUSE_POSIX_ACL (1 << 20)
361#define FUSE_ABORT_ERROR (1 << 21)
362#define FUSE_MAX_PAGES (1 << 22)
363#define FUSE_CACHE_SYMLINKS (1 << 23)
364#define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
365#define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
366#define FUSE_MAP_ALIGNMENT (1 << 26)
367#define FUSE_SUBMOUNTS (1 << 27)
368#define FUSE_HANDLE_KILLPRIV_V2 (1 << 28)
369#define FUSE_SETXATTR_EXT (1 << 29)
370
371
372
373
374
375
376#define CUSE_UNRESTRICTED_IOCTL (1 << 0)
377
378
379
380
381#define FUSE_RELEASE_FLUSH (1 << 0)
382#define FUSE_RELEASE_FLOCK_UNLOCK (1 << 1)
383
384
385
386
387#define FUSE_GETATTR_FH (1 << 0)
388
389
390
391
392#define FUSE_LK_FLOCK (1 << 0)
393
394
395
396
397
398
399
400
401#define FUSE_WRITE_CACHE (1 << 0)
402#define FUSE_WRITE_LOCKOWNER (1 << 1)
403#define FUSE_WRITE_KILL_SUIDGID (1 << 2)
404
405
406#define FUSE_WRITE_KILL_PRIV FUSE_WRITE_KILL_SUIDGID
407
408
409
410
411#define FUSE_READ_LOCKOWNER (1 << 1)
412
413
414
415
416
417
418
419
420
421
422
423
424
425#define FUSE_IOCTL_COMPAT (1 << 0)
426#define FUSE_IOCTL_UNRESTRICTED (1 << 1)
427#define FUSE_IOCTL_RETRY (1 << 2)
428#define FUSE_IOCTL_32BIT (1 << 3)
429#define FUSE_IOCTL_DIR (1 << 4)
430#define FUSE_IOCTL_COMPAT_X32 (1 << 5)
431
432#define FUSE_IOCTL_MAX_IOV 256
433
434
435
436
437
438
439#define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
440
441
442
443
444
445
446#define FUSE_FSYNC_FDATASYNC (1 << 0)
447
448
449
450
451
452
453#define FUSE_ATTR_SUBMOUNT (1 << 0)
454
455
456
457
458
459#define FUSE_OPEN_KILL_SUIDGID (1 << 0)
460
461
462
463
464
465#define FUSE_SETXATTR_ACL_KILL_SGID (1 << 0)
466
467enum fuse_opcode {
468 FUSE_LOOKUP = 1,
469 FUSE_FORGET = 2,
470 FUSE_GETATTR = 3,
471 FUSE_SETATTR = 4,
472 FUSE_READLINK = 5,
473 FUSE_SYMLINK = 6,
474 FUSE_MKNOD = 8,
475 FUSE_MKDIR = 9,
476 FUSE_UNLINK = 10,
477 FUSE_RMDIR = 11,
478 FUSE_RENAME = 12,
479 FUSE_LINK = 13,
480 FUSE_OPEN = 14,
481 FUSE_READ = 15,
482 FUSE_WRITE = 16,
483 FUSE_STATFS = 17,
484 FUSE_RELEASE = 18,
485 FUSE_FSYNC = 20,
486 FUSE_SETXATTR = 21,
487 FUSE_GETXATTR = 22,
488 FUSE_LISTXATTR = 23,
489 FUSE_REMOVEXATTR = 24,
490 FUSE_FLUSH = 25,
491 FUSE_INIT = 26,
492 FUSE_OPENDIR = 27,
493 FUSE_READDIR = 28,
494 FUSE_RELEASEDIR = 29,
495 FUSE_FSYNCDIR = 30,
496 FUSE_GETLK = 31,
497 FUSE_SETLK = 32,
498 FUSE_SETLKW = 33,
499 FUSE_ACCESS = 34,
500 FUSE_CREATE = 35,
501 FUSE_INTERRUPT = 36,
502 FUSE_BMAP = 37,
503 FUSE_DESTROY = 38,
504 FUSE_IOCTL = 39,
505 FUSE_POLL = 40,
506 FUSE_NOTIFY_REPLY = 41,
507 FUSE_BATCH_FORGET = 42,
508 FUSE_FALLOCATE = 43,
509 FUSE_READDIRPLUS = 44,
510 FUSE_RENAME2 = 45,
511 FUSE_LSEEK = 46,
512 FUSE_COPY_FILE_RANGE = 47,
513 FUSE_SETUPMAPPING = 48,
514 FUSE_REMOVEMAPPING = 49,
515 FUSE_SYNCFS = 50,
516
517
518 CUSE_INIT = 4096,
519
520
521 CUSE_INIT_BSWAP_RESERVED = 1048576,
522 FUSE_INIT_BSWAP_RESERVED = 436207616,
523};
524
525enum fuse_notify_code {
526 FUSE_NOTIFY_POLL = 1,
527 FUSE_NOTIFY_INVAL_INODE = 2,
528 FUSE_NOTIFY_INVAL_ENTRY = 3,
529 FUSE_NOTIFY_STORE = 4,
530 FUSE_NOTIFY_RETRIEVE = 5,
531 FUSE_NOTIFY_DELETE = 6,
532 FUSE_NOTIFY_CODE_MAX,
533};
534
535
536#define FUSE_MIN_READ_BUFFER 8192
537
538#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
539
540struct fuse_entry_out {
541 uint64_t nodeid;
542 uint64_t generation;
543
544 uint64_t entry_valid;
545 uint64_t attr_valid;
546 uint32_t entry_valid_nsec;
547 uint32_t attr_valid_nsec;
548 struct fuse_attr attr;
549};
550
551struct fuse_forget_in {
552 uint64_t nlookup;
553};
554
555struct fuse_forget_one {
556 uint64_t nodeid;
557 uint64_t nlookup;
558};
559
560struct fuse_batch_forget_in {
561 uint32_t count;
562 uint32_t dummy;
563};
564
565struct fuse_getattr_in {
566 uint32_t getattr_flags;
567 uint32_t dummy;
568 uint64_t fh;
569};
570
571#define FUSE_COMPAT_ATTR_OUT_SIZE 96
572
573struct fuse_attr_out {
574 uint64_t attr_valid;
575 uint32_t attr_valid_nsec;
576 uint32_t dummy;
577 struct fuse_attr attr;
578};
579
580#define FUSE_COMPAT_MKNOD_IN_SIZE 8
581
582struct fuse_mknod_in {
583 uint32_t mode;
584 uint32_t rdev;
585 uint32_t umask;
586 uint32_t padding;
587};
588
589struct fuse_mkdir_in {
590 uint32_t mode;
591 uint32_t umask;
592};
593
594struct fuse_rename_in {
595 uint64_t newdir;
596};
597
598struct fuse_rename2_in {
599 uint64_t newdir;
600 uint32_t flags;
601 uint32_t padding;
602};
603
604struct fuse_link_in {
605 uint64_t oldnodeid;
606};
607
608struct fuse_setattr_in {
609 uint32_t valid;
610 uint32_t padding;
611 uint64_t fh;
612 uint64_t size;
613 uint64_t lock_owner;
614 uint64_t atime;
615 uint64_t mtime;
616 uint64_t ctime;
617 uint32_t atimensec;
618 uint32_t mtimensec;
619 uint32_t ctimensec;
620 uint32_t mode;
621 uint32_t unused4;
622 uint32_t uid;
623 uint32_t gid;
624 uint32_t unused5;
625};
626
627struct fuse_open_in {
628 uint32_t flags;
629 uint32_t open_flags;
630};
631
632struct fuse_create_in {
633 uint32_t flags;
634 uint32_t mode;
635 uint32_t umask;
636 uint32_t open_flags;
637};
638
639struct fuse_open_out {
640 uint64_t fh;
641 uint32_t open_flags;
642 uint32_t padding;
643};
644
645struct fuse_release_in {
646 uint64_t fh;
647 uint32_t flags;
648 uint32_t release_flags;
649 uint64_t lock_owner;
650};
651
652struct fuse_flush_in {
653 uint64_t fh;
654 uint32_t unused;
655 uint32_t padding;
656 uint64_t lock_owner;
657};
658
659struct fuse_read_in {
660 uint64_t fh;
661 uint64_t offset;
662 uint32_t size;
663 uint32_t read_flags;
664 uint64_t lock_owner;
665 uint32_t flags;
666 uint32_t padding;
667};
668
669#define FUSE_COMPAT_WRITE_IN_SIZE 24
670
671struct fuse_write_in {
672 uint64_t fh;
673 uint64_t offset;
674 uint32_t size;
675 uint32_t write_flags;
676 uint64_t lock_owner;
677 uint32_t flags;
678 uint32_t padding;
679};
680
681struct fuse_write_out {
682 uint32_t size;
683 uint32_t padding;
684};
685
686#define FUSE_COMPAT_STATFS_SIZE 48
687
688struct fuse_statfs_out {
689 struct fuse_kstatfs st;
690};
691
692struct fuse_fsync_in {
693 uint64_t fh;
694 uint32_t fsync_flags;
695 uint32_t padding;
696};
697
698#define FUSE_COMPAT_SETXATTR_IN_SIZE 8
699
700struct fuse_setxattr_in {
701 uint32_t size;
702 uint32_t flags;
703 uint32_t setxattr_flags;
704 uint32_t padding;
705};
706
707struct fuse_getxattr_in {
708 uint32_t size;
709 uint32_t padding;
710};
711
712struct fuse_getxattr_out {
713 uint32_t size;
714 uint32_t padding;
715};
716
717struct fuse_lk_in {
718 uint64_t fh;
719 uint64_t owner;
720 struct fuse_file_lock lk;
721 uint32_t lk_flags;
722 uint32_t padding;
723};
724
725struct fuse_lk_out {
726 struct fuse_file_lock lk;
727};
728
729struct fuse_access_in {
730 uint32_t mask;
731 uint32_t padding;
732};
733
734struct fuse_init_in {
735 uint32_t major;
736 uint32_t minor;
737 uint32_t max_readahead;
738 uint32_t flags;
739};
740
741#define FUSE_COMPAT_INIT_OUT_SIZE 8
742#define FUSE_COMPAT_22_INIT_OUT_SIZE 24
743
744struct fuse_init_out {
745 uint32_t major;
746 uint32_t minor;
747 uint32_t max_readahead;
748 uint32_t flags;
749 uint16_t max_background;
750 uint16_t congestion_threshold;
751 uint32_t max_write;
752 uint32_t time_gran;
753 uint16_t max_pages;
754 uint16_t map_alignment;
755 uint32_t unused[8];
756};
757
758#define CUSE_INIT_INFO_MAX 4096
759
760struct cuse_init_in {
761 uint32_t major;
762 uint32_t minor;
763 uint32_t unused;
764 uint32_t flags;
765};
766
767struct cuse_init_out {
768 uint32_t major;
769 uint32_t minor;
770 uint32_t unused;
771 uint32_t flags;
772 uint32_t max_read;
773 uint32_t max_write;
774 uint32_t dev_major;
775 uint32_t dev_minor;
776 uint32_t spare[10];
777};
778
779struct fuse_interrupt_in {
780 uint64_t unique;
781};
782
783struct fuse_bmap_in {
784 uint64_t block;
785 uint32_t blocksize;
786 uint32_t padding;
787};
788
789struct fuse_bmap_out {
790 uint64_t block;
791};
792
793struct fuse_ioctl_in {
794 uint64_t fh;
795 uint32_t flags;
796 uint32_t cmd;
797 uint64_t arg;
798 uint32_t in_size;
799 uint32_t out_size;
800};
801
802struct fuse_ioctl_iovec {
803 uint64_t base;
804 uint64_t len;
805};
806
807struct fuse_ioctl_out {
808 int32_t result;
809 uint32_t flags;
810 uint32_t in_iovs;
811 uint32_t out_iovs;
812};
813
814struct fuse_poll_in {
815 uint64_t fh;
816 uint64_t kh;
817 uint32_t flags;
818 uint32_t events;
819};
820
821struct fuse_poll_out {
822 uint32_t revents;
823 uint32_t padding;
824};
825
826struct fuse_notify_poll_wakeup_out {
827 uint64_t kh;
828};
829
830struct fuse_fallocate_in {
831 uint64_t fh;
832 uint64_t offset;
833 uint64_t length;
834 uint32_t mode;
835 uint32_t padding;
836};
837
838struct fuse_in_header {
839 uint32_t len;
840 uint32_t opcode;
841 uint64_t unique;
842 uint64_t nodeid;
843 uint32_t uid;
844 uint32_t gid;
845 uint32_t pid;
846 uint32_t padding;
847};
848
849struct fuse_out_header {
850 uint32_t len;
851 int32_t error;
852 uint64_t unique;
853};
854
855struct fuse_dirent {
856 uint64_t ino;
857 uint64_t off;
858 uint32_t namelen;
859 uint32_t type;
860 char name[];
861};
862
863#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
864#define FUSE_DIRENT_ALIGN(x) \
865 (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
866#define FUSE_DIRENT_SIZE(d) \
867 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
868
869struct fuse_direntplus {
870 struct fuse_entry_out entry_out;
871 struct fuse_dirent dirent;
872};
873
874#define FUSE_NAME_OFFSET_DIRENTPLUS \
875 offsetof(struct fuse_direntplus, dirent.name)
876#define FUSE_DIRENTPLUS_SIZE(d) \
877 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
878
879struct fuse_notify_inval_inode_out {
880 uint64_t ino;
881 int64_t off;
882 int64_t len;
883};
884
885struct fuse_notify_inval_entry_out {
886 uint64_t parent;
887 uint32_t namelen;
888 uint32_t padding;
889};
890
891struct fuse_notify_delete_out {
892 uint64_t parent;
893 uint64_t child;
894 uint32_t namelen;
895 uint32_t padding;
896};
897
898struct fuse_notify_store_out {
899 uint64_t nodeid;
900 uint64_t offset;
901 uint32_t size;
902 uint32_t padding;
903};
904
905struct fuse_notify_retrieve_out {
906 uint64_t notify_unique;
907 uint64_t nodeid;
908 uint64_t offset;
909 uint32_t size;
910 uint32_t padding;
911};
912
913
914struct fuse_notify_retrieve_in {
915 uint64_t dummy1;
916 uint64_t offset;
917 uint32_t size;
918 uint32_t dummy2;
919 uint64_t dummy3;
920 uint64_t dummy4;
921};
922
923
924#define FUSE_DEV_IOC_MAGIC 229
925#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
926
927struct fuse_lseek_in {
928 uint64_t fh;
929 uint64_t offset;
930 uint32_t whence;
931 uint32_t padding;
932};
933
934struct fuse_lseek_out {
935 uint64_t offset;
936};
937
938struct fuse_copy_file_range_in {
939 uint64_t fh_in;
940 uint64_t off_in;
941 uint64_t nodeid_out;
942 uint64_t fh_out;
943 uint64_t off_out;
944 uint64_t len;
945 uint64_t flags;
946};
947
948#define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
949#define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
950struct fuse_setupmapping_in {
951
952 uint64_t fh;
953
954 uint64_t foffset;
955
956 uint64_t len;
957
958 uint64_t flags;
959
960 uint64_t moffset;
961};
962
963struct fuse_removemapping_in {
964
965 uint32_t count;
966};
967
968struct fuse_removemapping_one {
969
970 uint64_t moffset;
971
972 uint64_t len;
973};
974
975#define FUSE_REMOVEMAPPING_MAX_ENTRY \
976 (PAGE_SIZE / sizeof(struct fuse_removemapping_one))
977
978struct fuse_syncfs_in {
979 uint64_t padding;
980};
981
982#endif
983