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