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