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