xref: /linux-6.15/include/uapi/linux/fuse.h (revision 0f6439f6)
1e2be04c7SGreg Kroah-Hartman /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */
2607ca46eSDavid Howells /*
37e98d530SMiklos Szeredi     This file defines the kernel interface of FUSE
4607ca46eSDavid Howells     Copyright (C) 2001-2008  Miklos Szeredi <[email protected]>
5607ca46eSDavid Howells 
6607ca46eSDavid Howells     This program can be distributed under the terms of the GNU GPL.
7607ca46eSDavid Howells     See the file COPYING.
87e98d530SMiklos Szeredi 
97e98d530SMiklos Szeredi     This -- and only this -- header file may also be distributed under
107e98d530SMiklos Szeredi     the terms of the BSD Licence as follows:
117e98d530SMiklos Szeredi 
127e98d530SMiklos Szeredi     Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved.
137e98d530SMiklos Szeredi 
147e98d530SMiklos Szeredi     Redistribution and use in source and binary forms, with or without
157e98d530SMiklos Szeredi     modification, are permitted provided that the following conditions
167e98d530SMiklos Szeredi     are met:
177e98d530SMiklos Szeredi     1. Redistributions of source code must retain the above copyright
187e98d530SMiklos Szeredi        notice, this list of conditions and the following disclaimer.
197e98d530SMiklos Szeredi     2. Redistributions in binary form must reproduce the above copyright
207e98d530SMiklos Szeredi        notice, this list of conditions and the following disclaimer in the
217e98d530SMiklos Szeredi        documentation and/or other materials provided with the distribution.
227e98d530SMiklos Szeredi 
237e98d530SMiklos Szeredi     THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
247e98d530SMiklos Szeredi     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
257e98d530SMiklos Szeredi     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
267e98d530SMiklos Szeredi     ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
277e98d530SMiklos Szeredi     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
287e98d530SMiklos Szeredi     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
297e98d530SMiklos Szeredi     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
307e98d530SMiklos Szeredi     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
317e98d530SMiklos Szeredi     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
327e98d530SMiklos Szeredi     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
337e98d530SMiklos Szeredi     SUCH DAMAGE.
34607ca46eSDavid Howells */
35607ca46eSDavid Howells 
36607ca46eSDavid Howells /*
37607ca46eSDavid Howells  * This file defines the kernel interface of FUSE
38607ca46eSDavid Howells  *
39607ca46eSDavid Howells  * Protocol changelog:
40607ca46eSDavid Howells  *
419de55a37SAlan Somers  * 7.1:
429de55a37SAlan Somers  *  - add the following messages:
439de55a37SAlan Somers  *      FUSE_SETATTR, FUSE_SYMLINK, FUSE_MKNOD, FUSE_MKDIR, FUSE_UNLINK,
449de55a37SAlan Somers  *      FUSE_RMDIR, FUSE_RENAME, FUSE_LINK, FUSE_OPEN, FUSE_READ, FUSE_WRITE,
459de55a37SAlan Somers  *      FUSE_RELEASE, FUSE_FSYNC, FUSE_FLUSH, FUSE_SETXATTR, FUSE_GETXATTR,
469de55a37SAlan Somers  *      FUSE_LISTXATTR, FUSE_REMOVEXATTR, FUSE_OPENDIR, FUSE_READDIR,
479de55a37SAlan Somers  *      FUSE_RELEASEDIR
489de55a37SAlan Somers  *  - add padding to messages to accommodate 32-bit servers on 64-bit kernels
499de55a37SAlan Somers  *
509de55a37SAlan Somers  * 7.2:
519de55a37SAlan Somers  *  - add FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE flags
529de55a37SAlan Somers  *  - add FUSE_FSYNCDIR message
539de55a37SAlan Somers  *
549de55a37SAlan Somers  * 7.3:
559de55a37SAlan Somers  *  - add FUSE_ACCESS message
569de55a37SAlan Somers  *  - add FUSE_CREATE message
579de55a37SAlan Somers  *  - add filehandle to fuse_setattr_in
589de55a37SAlan Somers  *
599de55a37SAlan Somers  * 7.4:
609de55a37SAlan Somers  *  - add frsize to fuse_kstatfs
619de55a37SAlan Somers  *  - clean up request size limit checking
629de55a37SAlan Somers  *
639de55a37SAlan Somers  * 7.5:
649de55a37SAlan Somers  *  - add flags and max_write to fuse_init_out
659de55a37SAlan Somers  *
669de55a37SAlan Somers  * 7.6:
679de55a37SAlan Somers  *  - add max_readahead to fuse_init_in and fuse_init_out
689de55a37SAlan Somers  *
699de55a37SAlan Somers  * 7.7:
709de55a37SAlan Somers  *  - add FUSE_INTERRUPT message
719de55a37SAlan Somers  *  - add POSIX file lock support
729de55a37SAlan Somers  *
739de55a37SAlan Somers  * 7.8:
749de55a37SAlan Somers  *  - add lock_owner and flags fields to fuse_release_in
759de55a37SAlan Somers  *  - add FUSE_BMAP message
769de55a37SAlan Somers  *  - add FUSE_DESTROY message
779de55a37SAlan Somers  *
78607ca46eSDavid Howells  * 7.9:
79607ca46eSDavid Howells  *  - new fuse_getattr_in input argument of GETATTR
80607ca46eSDavid Howells  *  - add lk_flags in fuse_lk_in
81607ca46eSDavid Howells  *  - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
82607ca46eSDavid Howells  *  - add blksize field to fuse_attr
83607ca46eSDavid Howells  *  - add file flags field to fuse_read_in and fuse_write_in
847142fd1bSAlan Somers  *  - Add ATIME_NOW and MTIME_NOW flags to fuse_setattr_in
85607ca46eSDavid Howells  *
86607ca46eSDavid Howells  * 7.10
87607ca46eSDavid Howells  *  - add nonseekable open flag
88607ca46eSDavid Howells  *
89607ca46eSDavid Howells  * 7.11
90607ca46eSDavid Howells  *  - add IOCTL message
91607ca46eSDavid Howells  *  - add unsolicited notification support
92607ca46eSDavid Howells  *  - add POLL message and NOTIFY_POLL notification
93607ca46eSDavid Howells  *
94607ca46eSDavid Howells  * 7.12
9568065b84SAlan Somers  *  - add umask flag to input argument of create, mknod and mkdir
96607ca46eSDavid Howells  *  - add notification messages for invalidation of inodes and
97607ca46eSDavid Howells  *    directory entries
98607ca46eSDavid Howells  *
99607ca46eSDavid Howells  * 7.13
100607ca46eSDavid Howells  *  - make max number of background requests and congestion threshold
101607ca46eSDavid Howells  *    tunables
102607ca46eSDavid Howells  *
103607ca46eSDavid Howells  * 7.14
104607ca46eSDavid Howells  *  - add splice support to fuse device
105607ca46eSDavid Howells  *
106607ca46eSDavid Howells  * 7.15
107607ca46eSDavid Howells  *  - add store notify
108607ca46eSDavid Howells  *  - add retrieve notify
109607ca46eSDavid Howells  *
110607ca46eSDavid Howells  * 7.16
111607ca46eSDavid Howells  *  - add BATCH_FORGET request
112607ca46eSDavid Howells  *  - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct
113607ca46eSDavid Howells  *    fuse_ioctl_iovec' instead of ambiguous 'struct iovec'
114607ca46eSDavid Howells  *  - add FUSE_IOCTL_32BIT flag
115607ca46eSDavid Howells  *
116607ca46eSDavid Howells  * 7.17
117607ca46eSDavid Howells  *  - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK
118607ca46eSDavid Howells  *
119607ca46eSDavid Howells  * 7.18
120607ca46eSDavid Howells  *  - add FUSE_IOCTL_DIR flag
121607ca46eSDavid Howells  *  - add FUSE_NOTIFY_DELETE
122607ca46eSDavid Howells  *
123607ca46eSDavid Howells  * 7.19
124607ca46eSDavid Howells  *  - add FUSE_FALLOCATE
125607ca46eSDavid Howells  *
126607ca46eSDavid Howells  * 7.20
127607ca46eSDavid Howells  *  - add FUSE_AUTO_INVAL_DATA
12823c153e5SMiklos Szeredi  *
12923c153e5SMiklos Szeredi  * 7.21
13023c153e5SMiklos Szeredi  *  - add FUSE_READDIRPLUS
1310415d291SEnke Chen  *  - send the requested events in POLL request
13260b9df7aSMiklos Szeredi  *
13360b9df7aSMiklos Szeredi  * 7.22
13460b9df7aSMiklos Szeredi  *  - add FUSE_ASYNC_DIO
1354d99ff8fSPavel Emelyanov  *
1364d99ff8fSPavel Emelyanov  * 7.23
1374d99ff8fSPavel Emelyanov  *  - add FUSE_WRITEBACK_CACHE
138e27c9d38SMiklos Szeredi  *  - add time_gran to fuse_init_out
139e27c9d38SMiklos Szeredi  *  - add reserved space to fuse_init_out
140ab9e13f7SMaxim Patlasov  *  - add FATTR_CTIME
141ab9e13f7SMaxim Patlasov  *  - add ctime and ctimensec to fuse_setattr_in
1421560c974SMiklos Szeredi  *  - add FUSE_RENAME2 request
143d7afaec0SAndrew Gallagher  *  - add FUSE_NO_OPEN_SUPPORT flag
1440b5da8dbSRavishankar N  *
1450b5da8dbSRavishankar N  *  7.24
1460b5da8dbSRavishankar N  *  - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support
1475c672ab3SMiklos Szeredi  *
1485c672ab3SMiklos Szeredi  *  7.25
1495c672ab3SMiklos Szeredi  *  - add FUSE_PARALLEL_DIROPS
1505e940c1dSMiklos Szeredi  *
1515e940c1dSMiklos Szeredi  *  7.26
1525e940c1dSMiklos Szeredi  *  - add FUSE_HANDLE_KILLPRIV
15360bcc88aSSeth Forshee  *  - add FUSE_POSIX_ACL
1543b7008b2SSzymon Lukasz  *
1553b7008b2SSzymon Lukasz  *  7.27
1563b7008b2SSzymon Lukasz  *  - add FUSE_ABORT_ERROR
15788bc7d50SNiels de Vos  *
15888bc7d50SNiels de Vos  *  7.28
15988bc7d50SNiels de Vos  *  - add FUSE_COPY_FILE_RANGE
1606433b899SMiklos Szeredi  *  - add FOPEN_CACHE_DIR
1615da784ccSConstantine Shulyupin  *  - add FUSE_MAX_PAGES, add max_pages to init_out
1625571f1e6SDan Schatzberg  *  - add FUSE_CACHE_SYMLINKS
163d9a9ea94SChad Austin  *
164d9a9ea94SChad Austin  *  7.29
165d9a9ea94SChad Austin  *  - add FUSE_NO_OPENDIR_SUPPORT flag
166ad2ba64dSKirill Smelkov  *
167ad2ba64dSKirill Smelkov  *  7.30
168ad2ba64dSKirill Smelkov  *  - add FUSE_EXPLICIT_INVAL_DATA
1696407f44aSIan Abbott  *  - add FUSE_IOCTL_COMPAT_X32
1704a2abf99SMiklos Szeredi  *
1714a2abf99SMiklos Szeredi  *  7.31
1724a2abf99SMiklos Szeredi  *  - add FUSE_WRITE_KILL_PRIV flag
173c4bb667eSDr. David Alan Gilbert  *  - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING
174c4bb667eSDr. David Alan Gilbert  *  - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag
175c6ff213fSMax Reitz  *
176c6ff213fSMax Reitz  *  7.32
177c6ff213fSMax Reitz  *  - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS
17863f9909fSVivek Goyal  *
17963f9909fSVivek Goyal  *  7.33
18031792161SVivek Goyal  *  - add FUSE_HANDLE_KILLPRIV_V2, FUSE_WRITE_KILL_SUIDGID, FATTR_KILL_SUIDGID
181643a666aSVivek Goyal  *  - add FUSE_OPEN_KILL_SUIDGID
18252a4c95fSVivek Goyal  *  - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT
183550a7d3bSVivek Goyal  *  - add FUSE_SETXATTR_ACL_KILL_SGID
1842d82ab25SGreg Kurz  *
1852d82ab25SGreg Kurz  *  7.34
1862d82ab25SGreg Kurz  *  - add FUSE_SYNCFS
187a390ccb3SAmir Goldstein  *
188a390ccb3SAmir Goldstein  *  7.35
189a390ccb3SAmir Goldstein  *  - add FOPEN_NOFLUSH
19053db2893SMiklos Szeredi  *
19153db2893SMiklos Szeredi  *  7.36
19253db2893SMiklos Szeredi  *  - extend fuse_init_in with reserved fields, add FUSE_INIT_EXT init flag
19353db2893SMiklos Szeredi  *  - add flags2 to fuse_init_in and fuse_init_out
1943e2b6fdbSVivek Goyal  *  - add FUSE_SECURITY_CTX init flag
1953e2b6fdbSVivek Goyal  *  - add security context to create, mkdir, symlink, and mknod requests
19698046f74SJeffle Xu  *  - add FUSE_HAS_INODE_DAX, FUSE_ATTR_DAX
1977d375390SMiklos Szeredi  *
1987d375390SMiklos Szeredi  *  7.37
1997d375390SMiklos Szeredi  *  - add FUSE_TMPFILE
2004f8d3702SMiklos Szeredi  *
2014f8d3702SMiklos Szeredi  *  7.38
2024f8d3702SMiklos Szeredi  *  - add FUSE_EXPIRE_ONLY flag to fuse_notify_inval_entry
20315352405SDharmendra Singh  *  - add FOPEN_PARALLEL_DIRECT_WRITES
20415d937d7SMiklos Szeredi  *  - add total_extlen to fuse_in_header
20515d937d7SMiklos Szeredi  *  - add FUSE_MAX_NR_SECCTX
20615d937d7SMiklos Szeredi  *  - add extension header
2078ed7cb3fSMiklos Szeredi  *  - add FUSE_EXT_GROUPS
2088ed7cb3fSMiklos Szeredi  *  - add FUSE_CREATE_SUPP_GROUP
2095cadfbd5SMiklos Szeredi  *  - add FUSE_HAS_EXPIRE_ONLY
210e78662e8SHao Xu  *
211e78662e8SHao Xu  *  7.39
212c55e0a55STyler Fanelli  *  - add FUSE_DIRECT_IO_ALLOW_MMAP
213ba58a37cSMiklos Szeredi  *  - add FUSE_STATX and related structures
2147dc4e97aSAmir Goldstein  *
2157dc4e97aSAmir Goldstein  *  7.40
2167dc4e97aSAmir Goldstein  *  - add max_stack_depth to fuse_init_out, add FUSE_PASSTHROUGH init flag
2177dc4e97aSAmir Goldstein  *  - add backing_id to fuse_open_out, add FOPEN_PASSTHROUGH open flag
218e022f6a1SJingbo Xu  *  - add FUSE_NO_EXPORT_SUPPORT init flag
2199e7f5296SZhao Chen  *  - add FUSE_NOTIFY_RESEND, add FUSE_HAS_RESEND init flag
22016e1503eSAlexander Mikhalitsyn  *
22116e1503eSAlexander Mikhalitsyn  *  7.41
22216e1503eSAlexander Mikhalitsyn  *  - add FUSE_ALLOW_IDMAP
22324fe962cSBernd Schubert  *  7.42
22424fe962cSBernd Schubert  *  - Add FUSE_OVER_IO_URING and all other io-uring related flags and data
22524fe962cSBernd Schubert  *    structures:
22624fe962cSBernd Schubert  *    - struct fuse_uring_ent_in_out
22724fe962cSBernd Schubert  *    - struct fuse_uring_req_header
22824fe962cSBernd Schubert  *    - struct fuse_uring_cmd_req
22924fe962cSBernd Schubert  *    - FUSE_URING_IN_OUT_HEADER_SZ
23024fe962cSBernd Schubert  *    - FUSE_URING_OP_IN_OUT_SZ
23124fe962cSBernd Schubert  *    - enum fuse_uring_cmd
232*0f6439f6SJoanne Koong  *
233*0f6439f6SJoanne Koong  *  7.43
234*0f6439f6SJoanne Koong  *  - add FUSE_REQUEST_TIMEOUT
235607ca46eSDavid Howells  */
236607ca46eSDavid Howells 
237607ca46eSDavid Howells #ifndef _LINUX_FUSE_H
238607ca46eSDavid Howells #define _LINUX_FUSE_H
239607ca46eSDavid Howells 
2404c82456eSMiklos Szeredi #ifdef __KERNEL__
241607ca46eSDavid Howells #include <linux/types.h>
2427e98d530SMiklos Szeredi #else
2437e98d530SMiklos Szeredi #include <stdint.h>
2447e98d530SMiklos Szeredi #endif
245607ca46eSDavid Howells 
246607ca46eSDavid Howells /*
247607ca46eSDavid Howells  * Version negotiation:
248607ca46eSDavid Howells  *
249607ca46eSDavid Howells  * Both the kernel and userspace send the version they support in the
250607ca46eSDavid Howells  * INIT request and reply respectively.
251607ca46eSDavid Howells  *
252607ca46eSDavid Howells  * If the major versions match then both shall use the smallest
253607ca46eSDavid Howells  * of the two minor versions for communication.
254607ca46eSDavid Howells  *
255607ca46eSDavid Howells  * If the kernel supports a larger major version, then userspace shall
256607ca46eSDavid Howells  * reply with the major version it supports, ignore the rest of the
257607ca46eSDavid Howells  * INIT message and expect a new INIT message from the kernel with a
258607ca46eSDavid Howells  * matching major version.
259607ca46eSDavid Howells  *
260607ca46eSDavid Howells  * If the library supports a larger major version, then it shall fall
261607ca46eSDavid Howells  * back to the major protocol version sent by the kernel for
262607ca46eSDavid Howells  * communication and reply with that major version (and an arbitrary
263607ca46eSDavid Howells  * supported minor version).
264607ca46eSDavid Howells  */
265607ca46eSDavid Howells 
266607ca46eSDavid Howells /** Version number of this interface */
267607ca46eSDavid Howells #define FUSE_KERNEL_VERSION 7
268607ca46eSDavid Howells 
269607ca46eSDavid Howells /** Minor version number of this interface */
270*0f6439f6SJoanne Koong #define FUSE_KERNEL_MINOR_VERSION 43
271607ca46eSDavid Howells 
272607ca46eSDavid Howells /** The node ID of the root inode */
273607ca46eSDavid Howells #define FUSE_ROOT_ID 1
274607ca46eSDavid Howells 
275607ca46eSDavid Howells /* Make sure all structures are padded to 64bit boundary, so 32bit
276607ca46eSDavid Howells    userspace works under 64bit kernels */
277607ca46eSDavid Howells 
278607ca46eSDavid Howells struct fuse_attr {
2794c82456eSMiklos Szeredi 	uint64_t	ino;
2804c82456eSMiklos Szeredi 	uint64_t	size;
2814c82456eSMiklos Szeredi 	uint64_t	blocks;
2824c82456eSMiklos Szeredi 	uint64_t	atime;
2834c82456eSMiklos Szeredi 	uint64_t	mtime;
2844c82456eSMiklos Szeredi 	uint64_t	ctime;
2854c82456eSMiklos Szeredi 	uint32_t	atimensec;
2864c82456eSMiklos Szeredi 	uint32_t	mtimensec;
2874c82456eSMiklos Szeredi 	uint32_t	ctimensec;
2884c82456eSMiklos Szeredi 	uint32_t	mode;
2894c82456eSMiklos Szeredi 	uint32_t	nlink;
2904c82456eSMiklos Szeredi 	uint32_t	uid;
2914c82456eSMiklos Szeredi 	uint32_t	gid;
2924c82456eSMiklos Szeredi 	uint32_t	rdev;
2934c82456eSMiklos Szeredi 	uint32_t	blksize;
294c6ff213fSMax Reitz 	uint32_t	flags;
295607ca46eSDavid Howells };
296607ca46eSDavid Howells 
297ba58a37cSMiklos Szeredi /*
298ba58a37cSMiklos Szeredi  * The following structures are bit-for-bit compatible with the statx(2) ABI in
299ba58a37cSMiklos Szeredi  * Linux.
300ba58a37cSMiklos Szeredi  */
301ba58a37cSMiklos Szeredi struct fuse_sx_time {
302ba58a37cSMiklos Szeredi 	int64_t		tv_sec;
303ba58a37cSMiklos Szeredi 	uint32_t	tv_nsec;
304ba58a37cSMiklos Szeredi 	int32_t		__reserved;
305ba58a37cSMiklos Szeredi };
306ba58a37cSMiklos Szeredi 
307ba58a37cSMiklos Szeredi struct fuse_statx {
308ba58a37cSMiklos Szeredi 	uint32_t	mask;
309ba58a37cSMiklos Szeredi 	uint32_t	blksize;
310ba58a37cSMiklos Szeredi 	uint64_t	attributes;
311ba58a37cSMiklos Szeredi 	uint32_t	nlink;
312ba58a37cSMiklos Szeredi 	uint32_t	uid;
313ba58a37cSMiklos Szeredi 	uint32_t	gid;
314ba58a37cSMiklos Szeredi 	uint16_t	mode;
315ba58a37cSMiklos Szeredi 	uint16_t	__spare0[1];
316ba58a37cSMiklos Szeredi 	uint64_t	ino;
317ba58a37cSMiklos Szeredi 	uint64_t	size;
318ba58a37cSMiklos Szeredi 	uint64_t	blocks;
319ba58a37cSMiklos Szeredi 	uint64_t	attributes_mask;
320ba58a37cSMiklos Szeredi 	struct fuse_sx_time	atime;
321ba58a37cSMiklos Szeredi 	struct fuse_sx_time	btime;
322ba58a37cSMiklos Szeredi 	struct fuse_sx_time	ctime;
323ba58a37cSMiklos Szeredi 	struct fuse_sx_time	mtime;
324ba58a37cSMiklos Szeredi 	uint32_t	rdev_major;
325ba58a37cSMiklos Szeredi 	uint32_t	rdev_minor;
326ba58a37cSMiklos Szeredi 	uint32_t	dev_major;
327ba58a37cSMiklos Szeredi 	uint32_t	dev_minor;
328ba58a37cSMiklos Szeredi 	uint64_t	__spare2[14];
329ba58a37cSMiklos Szeredi };
330ba58a37cSMiklos Szeredi 
331607ca46eSDavid Howells struct fuse_kstatfs {
3324c82456eSMiklos Szeredi 	uint64_t	blocks;
3334c82456eSMiklos Szeredi 	uint64_t	bfree;
3344c82456eSMiklos Szeredi 	uint64_t	bavail;
3354c82456eSMiklos Szeredi 	uint64_t	files;
3364c82456eSMiklos Szeredi 	uint64_t	ffree;
3374c82456eSMiklos Szeredi 	uint32_t	bsize;
3384c82456eSMiklos Szeredi 	uint32_t	namelen;
3394c82456eSMiklos Szeredi 	uint32_t	frsize;
3404c82456eSMiklos Szeredi 	uint32_t	padding;
3414c82456eSMiklos Szeredi 	uint32_t	spare[6];
342607ca46eSDavid Howells };
343607ca46eSDavid Howells 
344607ca46eSDavid Howells struct fuse_file_lock {
3454c82456eSMiklos Szeredi 	uint64_t	start;
3464c82456eSMiklos Szeredi 	uint64_t	end;
3474c82456eSMiklos Szeredi 	uint32_t	type;
3484c82456eSMiklos Szeredi 	uint32_t	pid; /* tgid */
349607ca46eSDavid Howells };
350607ca46eSDavid Howells 
351607ca46eSDavid Howells /**
352607ca46eSDavid Howells  * Bitmasks for fuse_setattr_in.valid
353607ca46eSDavid Howells  */
354607ca46eSDavid Howells #define FATTR_MODE	(1 << 0)
355607ca46eSDavid Howells #define FATTR_UID	(1 << 1)
356607ca46eSDavid Howells #define FATTR_GID	(1 << 2)
357607ca46eSDavid Howells #define FATTR_SIZE	(1 << 3)
358607ca46eSDavid Howells #define FATTR_ATIME	(1 << 4)
359607ca46eSDavid Howells #define FATTR_MTIME	(1 << 5)
360607ca46eSDavid Howells #define FATTR_FH	(1 << 6)
361607ca46eSDavid Howells #define FATTR_ATIME_NOW	(1 << 7)
362607ca46eSDavid Howells #define FATTR_MTIME_NOW	(1 << 8)
363607ca46eSDavid Howells #define FATTR_LOCKOWNER	(1 << 9)
364ab9e13f7SMaxim Patlasov #define FATTR_CTIME	(1 << 10)
36531792161SVivek Goyal #define FATTR_KILL_SUIDGID	(1 << 11)
366607ca46eSDavid Howells 
367607ca46eSDavid Howells /**
368607ca46eSDavid Howells  * Flags returned by the OPEN request
369607ca46eSDavid Howells  *
370607ca46eSDavid Howells  * FOPEN_DIRECT_IO: bypass page cache for this open file
371607ca46eSDavid Howells  * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
372607ca46eSDavid Howells  * FOPEN_NONSEEKABLE: the file is not seekable
3736433b899SMiklos Szeredi  * FOPEN_CACHE_DIR: allow caching this directory
374bbd84f33SKirill Smelkov  * FOPEN_STREAM: the file is stream-like (no file position at all)
375a390ccb3SAmir Goldstein  * FOPEN_NOFLUSH: don't flush data cache on close (unless FUSE_WRITEBACK_CACHE)
37615352405SDharmendra Singh  * FOPEN_PARALLEL_DIRECT_WRITES: Allow concurrent direct writes on the same inode
3777dc4e97aSAmir Goldstein  * FOPEN_PASSTHROUGH: passthrough read/write io for this open file
378607ca46eSDavid Howells  */
379607ca46eSDavid Howells #define FOPEN_DIRECT_IO		(1 << 0)
380607ca46eSDavid Howells #define FOPEN_KEEP_CACHE	(1 << 1)
381607ca46eSDavid Howells #define FOPEN_NONSEEKABLE	(1 << 2)
3826433b899SMiklos Szeredi #define FOPEN_CACHE_DIR		(1 << 3)
383bbd84f33SKirill Smelkov #define FOPEN_STREAM		(1 << 4)
384a390ccb3SAmir Goldstein #define FOPEN_NOFLUSH		(1 << 5)
38515352405SDharmendra Singh #define FOPEN_PARALLEL_DIRECT_WRITES	(1 << 6)
3867dc4e97aSAmir Goldstein #define FOPEN_PASSTHROUGH	(1 << 7)
387607ca46eSDavid Howells 
388607ca46eSDavid Howells /**
389607ca46eSDavid Howells  * INIT request/reply flags
390607ca46eSDavid Howells  *
391607ca46eSDavid Howells  * FUSE_ASYNC_READ: asynchronous read requests
392607ca46eSDavid Howells  * FUSE_POSIX_LOCKS: remote locking for POSIX file locks
393607ca46eSDavid Howells  * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported)
394607ca46eSDavid Howells  * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem
395607ca46eSDavid Howells  * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
396607ca46eSDavid Howells  * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB
397607ca46eSDavid Howells  * FUSE_DONT_MASK: don't apply umask to file mode on create operations
398607ca46eSDavid Howells  * FUSE_SPLICE_WRITE: kernel supports splice write on the device
399607ca46eSDavid Howells  * FUSE_SPLICE_MOVE: kernel supports splice move on the device
400607ca46eSDavid Howells  * FUSE_SPLICE_READ: kernel supports splice read on the device
401607ca46eSDavid Howells  * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks
402607ca46eSDavid Howells  * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories
403607ca46eSDavid Howells  * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages
404634734b6SEric Wong  * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one)
405634734b6SEric Wong  * FUSE_READDIRPLUS_AUTO: adaptive readdirplus
40660b9df7aSMiklos Szeredi  * FUSE_ASYNC_DIO: asynchronous direct I/O submission
4074d99ff8fSPavel Emelyanov  * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes
408d7afaec0SAndrew Gallagher  * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens
4095c672ab3SMiklos Szeredi  * FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir
4105e940c1dSMiklos Szeredi  * FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc
41160bcc88aSSeth Forshee  * FUSE_POSIX_ACL: filesystem supports posix acls
4123b7008b2SSzymon Lukasz  * FUSE_ABORT_ERROR: reading the device after abort returns ECONNABORTED
4135da784ccSConstantine Shulyupin  * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages
4145571f1e6SDan Schatzberg  * FUSE_CACHE_SYMLINKS: cache READLINK responses
415d9a9ea94SChad Austin  * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
416ad2ba64dSKirill Smelkov  * FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request
417fd1a1dc6SStefan Hajnoczi  * FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for
418fd1a1dc6SStefan Hajnoczi  *		       foffset and moffset fields in struct
419fd1a1dc6SStefan Hajnoczi  *		       fuse_setupmapping_out and fuse_removemapping_one.
420c6ff213fSMax Reitz  * FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts
42163f9909fSVivek Goyal  * FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc.
42263f9909fSVivek Goyal  *			Upon write/truncate suid/sgid is only killed if caller
42363f9909fSVivek Goyal  *			does not have CAP_FSETID. Additionally upon
42463f9909fSVivek Goyal  *			write/truncate sgid is killed only if file has group
42563f9909fSVivek Goyal  *			execute permission. (Same as Linux VFS behavior).
42652a4c95fSVivek Goyal  * FUSE_SETXATTR_EXT:	Server supports extended struct fuse_setxattr_in
42753db2893SMiklos Szeredi  * FUSE_INIT_EXT: extended fuse_init_in request
42853db2893SMiklos Szeredi  * FUSE_INIT_RESERVED: reserved, do not use
4293e2b6fdbSVivek Goyal  * FUSE_SECURITY_CTX:	add security context to create, mkdir, symlink, and
4303e2b6fdbSVivek Goyal  *			mknod
43198046f74SJeffle Xu  * FUSE_HAS_INODE_DAX:  use per inode DAX
4328ed7cb3fSMiklos Szeredi  * FUSE_CREATE_SUPP_GROUP: add supplementary group info to create, mkdir,
4338ed7cb3fSMiklos Szeredi  *			symlink and mknod (single group that matches parent)
4345cadfbd5SMiklos Szeredi  * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation
435c55e0a55STyler Fanelli  * FUSE_DIRECT_IO_ALLOW_MMAP: allow shared mmap in FOPEN_DIRECT_IO mode.
436e022f6a1SJingbo Xu  * FUSE_NO_EXPORT_SUPPORT: explicitly disable export support
4379e7f5296SZhao Chen  * FUSE_HAS_RESEND: kernel supports resending pending requests, and the high bit
4389e7f5296SZhao Chen  *		    of the request ID indicates resend requests
43916e1503eSAlexander Mikhalitsyn  * FUSE_ALLOW_IDMAP: allow creation of idmapped mounts
44024fe962cSBernd Schubert  * FUSE_OVER_IO_URING: Indicate that client supports io-uring
441*0f6439f6SJoanne Koong  * FUSE_REQUEST_TIMEOUT: kernel supports timing out requests.
442*0f6439f6SJoanne Koong  *			 init_out.request_timeout contains the timeout (in secs)
443607ca46eSDavid Howells  */
444607ca46eSDavid Howells #define FUSE_ASYNC_READ		(1 << 0)
445607ca46eSDavid Howells #define FUSE_POSIX_LOCKS	(1 << 1)
446607ca46eSDavid Howells #define FUSE_FILE_OPS		(1 << 2)
447607ca46eSDavid Howells #define FUSE_ATOMIC_O_TRUNC	(1 << 3)
448607ca46eSDavid Howells #define FUSE_EXPORT_SUPPORT	(1 << 4)
449607ca46eSDavid Howells #define FUSE_BIG_WRITES		(1 << 5)
450607ca46eSDavid Howells #define FUSE_DONT_MASK		(1 << 6)
451607ca46eSDavid Howells #define FUSE_SPLICE_WRITE	(1 << 7)
452607ca46eSDavid Howells #define FUSE_SPLICE_MOVE	(1 << 8)
453607ca46eSDavid Howells #define FUSE_SPLICE_READ	(1 << 9)
454607ca46eSDavid Howells #define FUSE_FLOCK_LOCKS	(1 << 10)
455607ca46eSDavid Howells #define FUSE_HAS_IOCTL_DIR	(1 << 11)
456607ca46eSDavid Howells #define FUSE_AUTO_INVAL_DATA	(1 << 12)
4570b05b183SAnand V. Avati #define FUSE_DO_READDIRPLUS	(1 << 13)
458634734b6SEric Wong #define FUSE_READDIRPLUS_AUTO	(1 << 14)
45960b9df7aSMiklos Szeredi #define FUSE_ASYNC_DIO		(1 << 15)
4604d99ff8fSPavel Emelyanov #define FUSE_WRITEBACK_CACHE	(1 << 16)
461d7afaec0SAndrew Gallagher #define FUSE_NO_OPEN_SUPPORT	(1 << 17)
4625c672ab3SMiklos Szeredi #define FUSE_PARALLEL_DIROPS    (1 << 18)
4635e940c1dSMiklos Szeredi #define FUSE_HANDLE_KILLPRIV	(1 << 19)
46460bcc88aSSeth Forshee #define FUSE_POSIX_ACL		(1 << 20)
4653b7008b2SSzymon Lukasz #define FUSE_ABORT_ERROR	(1 << 21)
4665da784ccSConstantine Shulyupin #define FUSE_MAX_PAGES		(1 << 22)
4675571f1e6SDan Schatzberg #define FUSE_CACHE_SYMLINKS	(1 << 23)
468d9a9ea94SChad Austin #define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
469ad2ba64dSKirill Smelkov #define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
470c4bb667eSDr. David Alan Gilbert #define FUSE_MAP_ALIGNMENT	(1 << 26)
471c6ff213fSMax Reitz #define FUSE_SUBMOUNTS		(1 << 27)
47263f9909fSVivek Goyal #define FUSE_HANDLE_KILLPRIV_V2	(1 << 28)
47352a4c95fSVivek Goyal #define FUSE_SETXATTR_EXT	(1 << 29)
47453db2893SMiklos Szeredi #define FUSE_INIT_EXT		(1 << 30)
47553db2893SMiklos Szeredi #define FUSE_INIT_RESERVED	(1 << 31)
47653db2893SMiklos Szeredi /* bits 32..63 get shifted down 32 bits into the flags2 field */
4773e2b6fdbSVivek Goyal #define FUSE_SECURITY_CTX	(1ULL << 32)
47898046f74SJeffle Xu #define FUSE_HAS_INODE_DAX	(1ULL << 33)
4798ed7cb3fSMiklos Szeredi #define FUSE_CREATE_SUPP_GROUP	(1ULL << 34)
4805cadfbd5SMiklos Szeredi #define FUSE_HAS_EXPIRE_ONLY	(1ULL << 35)
481c55e0a55STyler Fanelli #define FUSE_DIRECT_IO_ALLOW_MMAP (1ULL << 36)
4827dc4e97aSAmir Goldstein #define FUSE_PASSTHROUGH	(1ULL << 37)
483e022f6a1SJingbo Xu #define FUSE_NO_EXPORT_SUPPORT	(1ULL << 38)
4849e7f5296SZhao Chen #define FUSE_HAS_RESEND		(1ULL << 39)
485c55e0a55STyler Fanelli /* Obsolete alias for FUSE_DIRECT_IO_ALLOW_MMAP */
486c55e0a55STyler Fanelli #define FUSE_DIRECT_IO_RELAX	FUSE_DIRECT_IO_ALLOW_MMAP
48716e1503eSAlexander Mikhalitsyn #define FUSE_ALLOW_IDMAP	(1ULL << 40)
48824fe962cSBernd Schubert #define FUSE_OVER_IO_URING	(1ULL << 41)
489*0f6439f6SJoanne Koong #define FUSE_REQUEST_TIMEOUT	(1ULL << 42)
490607ca46eSDavid Howells 
491607ca46eSDavid Howells /**
492607ca46eSDavid Howells  * CUSE INIT request/reply flags
493607ca46eSDavid Howells  *
494607ca46eSDavid Howells  * CUSE_UNRESTRICTED_IOCTL:  use unrestricted ioctl
495607ca46eSDavid Howells  */
496607ca46eSDavid Howells #define CUSE_UNRESTRICTED_IOCTL	(1 << 0)
497607ca46eSDavid Howells 
498607ca46eSDavid Howells /**
499607ca46eSDavid Howells  * Release flags
500607ca46eSDavid Howells  */
501607ca46eSDavid Howells #define FUSE_RELEASE_FLUSH	(1 << 0)
502607ca46eSDavid Howells #define FUSE_RELEASE_FLOCK_UNLOCK	(1 << 1)
503607ca46eSDavid Howells 
504607ca46eSDavid Howells /**
505607ca46eSDavid Howells  * Getattr flags
506607ca46eSDavid Howells  */
507607ca46eSDavid Howells #define FUSE_GETATTR_FH		(1 << 0)
508607ca46eSDavid Howells 
509607ca46eSDavid Howells /**
510607ca46eSDavid Howells  * Lock flags
511607ca46eSDavid Howells  */
512607ca46eSDavid Howells #define FUSE_LK_FLOCK		(1 << 0)
513607ca46eSDavid Howells 
514607ca46eSDavid Howells /**
515607ca46eSDavid Howells  * WRITE flags
516607ca46eSDavid Howells  *
517607ca46eSDavid Howells  * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
518607ca46eSDavid Howells  * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
51910c52c84SMiklos Szeredi  * FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits
520607ca46eSDavid Howells  */
521607ca46eSDavid Howells #define FUSE_WRITE_CACHE	(1 << 0)
522607ca46eSDavid Howells #define FUSE_WRITE_LOCKOWNER	(1 << 1)
52310c52c84SMiklos Szeredi #define FUSE_WRITE_KILL_SUIDGID (1 << 2)
52410c52c84SMiklos Szeredi 
52510c52c84SMiklos Szeredi /* Obsolete alias; this flag implies killing suid/sgid only. */
52610c52c84SMiklos Szeredi #define FUSE_WRITE_KILL_PRIV	FUSE_WRITE_KILL_SUIDGID
527607ca46eSDavid Howells 
528607ca46eSDavid Howells /**
529607ca46eSDavid Howells  * Read flags
530607ca46eSDavid Howells  */
531607ca46eSDavid Howells #define FUSE_READ_LOCKOWNER	(1 << 1)
532607ca46eSDavid Howells 
533607ca46eSDavid Howells /**
534607ca46eSDavid Howells  * Ioctl flags
535607ca46eSDavid Howells  *
536607ca46eSDavid Howells  * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
537607ca46eSDavid Howells  * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
538607ca46eSDavid Howells  * FUSE_IOCTL_RETRY: retry with new iovecs
539607ca46eSDavid Howells  * FUSE_IOCTL_32BIT: 32bit ioctl
540607ca46eSDavid Howells  * FUSE_IOCTL_DIR: is a directory
5416407f44aSIan Abbott  * FUSE_IOCTL_COMPAT_X32: x32 compat ioctl on 64bit machine (64bit time_t)
542607ca46eSDavid Howells  *
543607ca46eSDavid Howells  * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
544607ca46eSDavid Howells  */
545607ca46eSDavid Howells #define FUSE_IOCTL_COMPAT	(1 << 0)
546607ca46eSDavid Howells #define FUSE_IOCTL_UNRESTRICTED	(1 << 1)
547607ca46eSDavid Howells #define FUSE_IOCTL_RETRY	(1 << 2)
548607ca46eSDavid Howells #define FUSE_IOCTL_32BIT	(1 << 3)
549607ca46eSDavid Howells #define FUSE_IOCTL_DIR		(1 << 4)
5506407f44aSIan Abbott #define FUSE_IOCTL_COMPAT_X32	(1 << 5)
551607ca46eSDavid Howells 
552607ca46eSDavid Howells #define FUSE_IOCTL_MAX_IOV	256
553607ca46eSDavid Howells 
554607ca46eSDavid Howells /**
555607ca46eSDavid Howells  * Poll flags
556607ca46eSDavid Howells  *
557607ca46eSDavid Howells  * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify
558607ca46eSDavid Howells  */
559607ca46eSDavid Howells #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
560607ca46eSDavid Howells 
561154603feSAlan Somers /**
562154603feSAlan Somers  * Fsync flags
563154603feSAlan Somers  *
564154603feSAlan Somers  * FUSE_FSYNC_FDATASYNC: Sync data only, not metadata
565154603feSAlan Somers  */
566154603feSAlan Somers #define FUSE_FSYNC_FDATASYNC	(1 << 0)
567154603feSAlan Somers 
568c6ff213fSMax Reitz /**
569c6ff213fSMax Reitz  * fuse_attr flags
570c6ff213fSMax Reitz  *
571c6ff213fSMax Reitz  * FUSE_ATTR_SUBMOUNT: Object is a submount root
57298046f74SJeffle Xu  * FUSE_ATTR_DAX: Enable DAX for this file in per inode DAX mode
573c6ff213fSMax Reitz  */
574c6ff213fSMax Reitz #define FUSE_ATTR_SUBMOUNT      (1 << 0)
57598046f74SJeffle Xu #define FUSE_ATTR_DAX		(1 << 1)
576c6ff213fSMax Reitz 
577643a666aSVivek Goyal /**
578643a666aSVivek Goyal  * Open flags
579643a666aSVivek Goyal  * FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable
580643a666aSVivek Goyal  */
581643a666aSVivek Goyal #define FUSE_OPEN_KILL_SUIDGID	(1 << 0)
582643a666aSVivek Goyal 
583550a7d3bSVivek Goyal /**
584550a7d3bSVivek Goyal  * setxattr flags
585550a7d3bSVivek Goyal  * FUSE_SETXATTR_ACL_KILL_SGID: Clear SGID when system.posix_acl_access is set
586550a7d3bSVivek Goyal  */
587550a7d3bSVivek Goyal #define FUSE_SETXATTR_ACL_KILL_SGID	(1 << 0)
588550a7d3bSVivek Goyal 
5894f8d3702SMiklos Szeredi /**
5904f8d3702SMiklos Szeredi  * notify_inval_entry flags
5914f8d3702SMiklos Szeredi  * FUSE_EXPIRE_ONLY
5924f8d3702SMiklos Szeredi  */
5934f8d3702SMiklos Szeredi #define FUSE_EXPIRE_ONLY		(1 << 0)
5944f8d3702SMiklos Szeredi 
59515d937d7SMiklos Szeredi /**
59615d937d7SMiklos Szeredi  * extension type
59715d937d7SMiklos Szeredi  * FUSE_MAX_NR_SECCTX: maximum value of &fuse_secctx_header.nr_secctx
5988ed7cb3fSMiklos Szeredi  * FUSE_EXT_GROUPS: &fuse_supp_groups extension
59915d937d7SMiklos Szeredi  */
60015d937d7SMiklos Szeredi enum fuse_ext_type {
60115d937d7SMiklos Szeredi 	/* Types 0..31 are reserved for fuse_secctx_header */
60215d937d7SMiklos Szeredi 	FUSE_MAX_NR_SECCTX	= 31,
6038ed7cb3fSMiklos Szeredi 	FUSE_EXT_GROUPS		= 32,
60415d937d7SMiklos Szeredi };
60515d937d7SMiklos Szeredi 
606607ca46eSDavid Howells enum fuse_opcode {
607607ca46eSDavid Howells 	FUSE_LOOKUP		= 1,
608607ca46eSDavid Howells 	FUSE_FORGET		= 2,  /* no reply */
609607ca46eSDavid Howells 	FUSE_GETATTR		= 3,
610607ca46eSDavid Howells 	FUSE_SETATTR		= 4,
611607ca46eSDavid Howells 	FUSE_READLINK		= 5,
612607ca46eSDavid Howells 	FUSE_SYMLINK		= 6,
613607ca46eSDavid Howells 	FUSE_MKNOD		= 8,
614607ca46eSDavid Howells 	FUSE_MKDIR		= 9,
615607ca46eSDavid Howells 	FUSE_UNLINK		= 10,
616607ca46eSDavid Howells 	FUSE_RMDIR		= 11,
617607ca46eSDavid Howells 	FUSE_RENAME		= 12,
618607ca46eSDavid Howells 	FUSE_LINK		= 13,
619607ca46eSDavid Howells 	FUSE_OPEN		= 14,
620607ca46eSDavid Howells 	FUSE_READ		= 15,
621607ca46eSDavid Howells 	FUSE_WRITE		= 16,
622607ca46eSDavid Howells 	FUSE_STATFS		= 17,
623607ca46eSDavid Howells 	FUSE_RELEASE		= 18,
624607ca46eSDavid Howells 	FUSE_FSYNC		= 20,
625607ca46eSDavid Howells 	FUSE_SETXATTR		= 21,
626607ca46eSDavid Howells 	FUSE_GETXATTR		= 22,
627607ca46eSDavid Howells 	FUSE_LISTXATTR		= 23,
628607ca46eSDavid Howells 	FUSE_REMOVEXATTR	= 24,
629607ca46eSDavid Howells 	FUSE_FLUSH		= 25,
630607ca46eSDavid Howells 	FUSE_INIT		= 26,
631607ca46eSDavid Howells 	FUSE_OPENDIR		= 27,
632607ca46eSDavid Howells 	FUSE_READDIR		= 28,
633607ca46eSDavid Howells 	FUSE_RELEASEDIR		= 29,
634607ca46eSDavid Howells 	FUSE_FSYNCDIR		= 30,
635607ca46eSDavid Howells 	FUSE_GETLK		= 31,
636607ca46eSDavid Howells 	FUSE_SETLK		= 32,
637607ca46eSDavid Howells 	FUSE_SETLKW		= 33,
638607ca46eSDavid Howells 	FUSE_ACCESS		= 34,
639607ca46eSDavid Howells 	FUSE_CREATE		= 35,
640607ca46eSDavid Howells 	FUSE_INTERRUPT		= 36,
641607ca46eSDavid Howells 	FUSE_BMAP		= 37,
642607ca46eSDavid Howells 	FUSE_DESTROY		= 38,
643607ca46eSDavid Howells 	FUSE_IOCTL		= 39,
644607ca46eSDavid Howells 	FUSE_POLL		= 40,
645607ca46eSDavid Howells 	FUSE_NOTIFY_REPLY	= 41,
646607ca46eSDavid Howells 	FUSE_BATCH_FORGET	= 42,
647607ca46eSDavid Howells 	FUSE_FALLOCATE		= 43,
6480b05b183SAnand V. Avati 	FUSE_READDIRPLUS	= 44,
6491560c974SMiklos Szeredi 	FUSE_RENAME2		= 45,
6500b5da8dbSRavishankar N 	FUSE_LSEEK		= 46,
65188bc7d50SNiels de Vos 	FUSE_COPY_FILE_RANGE	= 47,
652c4bb667eSDr. David Alan Gilbert 	FUSE_SETUPMAPPING	= 48,
653c4bb667eSDr. David Alan Gilbert 	FUSE_REMOVEMAPPING	= 49,
6542d82ab25SGreg Kurz 	FUSE_SYNCFS		= 50,
6557d375390SMiklos Szeredi 	FUSE_TMPFILE		= 51,
656ba58a37cSMiklos Szeredi 	FUSE_STATX		= 52,
657607ca46eSDavid Howells 
658607ca46eSDavid Howells 	/* CUSE specific operations */
659607ca46eSDavid Howells 	CUSE_INIT		= 4096,
660501ae8ecSMichael S. Tsirkin 
661501ae8ecSMichael S. Tsirkin 	/* Reserved opcodes: helpful to detect structure endian-ness */
662501ae8ecSMichael S. Tsirkin 	CUSE_INIT_BSWAP_RESERVED	= 1048576,	/* CUSE_INIT << 8 */
663501ae8ecSMichael S. Tsirkin 	FUSE_INIT_BSWAP_RESERVED	= 436207616,	/* FUSE_INIT << 24 */
664607ca46eSDavid Howells };
665607ca46eSDavid Howells 
666607ca46eSDavid Howells enum fuse_notify_code {
667607ca46eSDavid Howells 	FUSE_NOTIFY_POLL   = 1,
668607ca46eSDavid Howells 	FUSE_NOTIFY_INVAL_INODE = 2,
669607ca46eSDavid Howells 	FUSE_NOTIFY_INVAL_ENTRY = 3,
670607ca46eSDavid Howells 	FUSE_NOTIFY_STORE = 4,
671607ca46eSDavid Howells 	FUSE_NOTIFY_RETRIEVE = 5,
672607ca46eSDavid Howells 	FUSE_NOTIFY_DELETE = 6,
673760eac73SZhao Chen 	FUSE_NOTIFY_RESEND = 7,
674607ca46eSDavid Howells 	FUSE_NOTIFY_CODE_MAX,
675607ca46eSDavid Howells };
676607ca46eSDavid Howells 
677607ca46eSDavid Howells /* The read buffer is required to be at least 8k, but may be much larger */
678607ca46eSDavid Howells #define FUSE_MIN_READ_BUFFER 8192
679607ca46eSDavid Howells 
680607ca46eSDavid Howells #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
681607ca46eSDavid Howells 
682607ca46eSDavid Howells struct fuse_entry_out {
6834c82456eSMiklos Szeredi 	uint64_t	nodeid;		/* Inode ID */
6844c82456eSMiklos Szeredi 	uint64_t	generation;	/* Inode generation: nodeid:gen must
685607ca46eSDavid Howells 					   be unique for the fs's lifetime */
6864c82456eSMiklos Szeredi 	uint64_t	entry_valid;	/* Cache timeout for the name */
6874c82456eSMiklos Szeredi 	uint64_t	attr_valid;	/* Cache timeout for the attributes */
6884c82456eSMiklos Szeredi 	uint32_t	entry_valid_nsec;
6894c82456eSMiklos Szeredi 	uint32_t	attr_valid_nsec;
690607ca46eSDavid Howells 	struct fuse_attr attr;
691607ca46eSDavid Howells };
692607ca46eSDavid Howells 
693607ca46eSDavid Howells struct fuse_forget_in {
6944c82456eSMiklos Szeredi 	uint64_t	nlookup;
695607ca46eSDavid Howells };
696607ca46eSDavid Howells 
697607ca46eSDavid Howells struct fuse_forget_one {
6984c82456eSMiklos Szeredi 	uint64_t	nodeid;
6994c82456eSMiklos Szeredi 	uint64_t	nlookup;
700607ca46eSDavid Howells };
701607ca46eSDavid Howells 
702607ca46eSDavid Howells struct fuse_batch_forget_in {
7034c82456eSMiklos Szeredi 	uint32_t	count;
7044c82456eSMiklos Szeredi 	uint32_t	dummy;
705607ca46eSDavid Howells };
706607ca46eSDavid Howells 
707607ca46eSDavid Howells struct fuse_getattr_in {
7084c82456eSMiklos Szeredi 	uint32_t	getattr_flags;
7094c82456eSMiklos Szeredi 	uint32_t	dummy;
7104c82456eSMiklos Szeredi 	uint64_t	fh;
711607ca46eSDavid Howells };
712607ca46eSDavid Howells 
713607ca46eSDavid Howells #define FUSE_COMPAT_ATTR_OUT_SIZE 96
714607ca46eSDavid Howells 
715607ca46eSDavid Howells struct fuse_attr_out {
7164c82456eSMiklos Szeredi 	uint64_t	attr_valid;	/* Cache timeout for the attributes */
7174c82456eSMiklos Szeredi 	uint32_t	attr_valid_nsec;
7184c82456eSMiklos Szeredi 	uint32_t	dummy;
719607ca46eSDavid Howells 	struct fuse_attr attr;
720607ca46eSDavid Howells };
721607ca46eSDavid Howells 
722ba58a37cSMiklos Szeredi struct fuse_statx_in {
723ba58a37cSMiklos Szeredi 	uint32_t	getattr_flags;
724ba58a37cSMiklos Szeredi 	uint32_t	reserved;
725ba58a37cSMiklos Szeredi 	uint64_t	fh;
726ba58a37cSMiklos Szeredi 	uint32_t	sx_flags;
727ba58a37cSMiklos Szeredi 	uint32_t	sx_mask;
728ba58a37cSMiklos Szeredi };
729ba58a37cSMiklos Szeredi 
730ba58a37cSMiklos Szeredi struct fuse_statx_out {
731ba58a37cSMiklos Szeredi 	uint64_t	attr_valid;	/* Cache timeout for the attributes */
732ba58a37cSMiklos Szeredi 	uint32_t	attr_valid_nsec;
733ba58a37cSMiklos Szeredi 	uint32_t	flags;
734ba58a37cSMiklos Szeredi 	uint64_t	spare[2];
735ba58a37cSMiklos Szeredi 	struct fuse_statx stat;
736ba58a37cSMiklos Szeredi };
737ba58a37cSMiklos Szeredi 
738607ca46eSDavid Howells #define FUSE_COMPAT_MKNOD_IN_SIZE 8
739607ca46eSDavid Howells 
740607ca46eSDavid Howells struct fuse_mknod_in {
7414c82456eSMiklos Szeredi 	uint32_t	mode;
7424c82456eSMiklos Szeredi 	uint32_t	rdev;
7434c82456eSMiklos Szeredi 	uint32_t	umask;
7444c82456eSMiklos Szeredi 	uint32_t	padding;
745607ca46eSDavid Howells };
746607ca46eSDavid Howells 
747607ca46eSDavid Howells struct fuse_mkdir_in {
7484c82456eSMiklos Szeredi 	uint32_t	mode;
7494c82456eSMiklos Szeredi 	uint32_t	umask;
750607ca46eSDavid Howells };
751607ca46eSDavid Howells 
752607ca46eSDavid Howells struct fuse_rename_in {
7534c82456eSMiklos Szeredi 	uint64_t	newdir;
754607ca46eSDavid Howells };
755607ca46eSDavid Howells 
7561560c974SMiklos Szeredi struct fuse_rename2_in {
7571560c974SMiklos Szeredi 	uint64_t	newdir;
7581560c974SMiklos Szeredi 	uint32_t	flags;
7591560c974SMiklos Szeredi 	uint32_t	padding;
7601560c974SMiklos Szeredi };
7611560c974SMiklos Szeredi 
762607ca46eSDavid Howells struct fuse_link_in {
7634c82456eSMiklos Szeredi 	uint64_t	oldnodeid;
764607ca46eSDavid Howells };
765607ca46eSDavid Howells 
766607ca46eSDavid Howells struct fuse_setattr_in {
7674c82456eSMiklos Szeredi 	uint32_t	valid;
7684c82456eSMiklos Szeredi 	uint32_t	padding;
7694c82456eSMiklos Szeredi 	uint64_t	fh;
7704c82456eSMiklos Szeredi 	uint64_t	size;
7714c82456eSMiklos Szeredi 	uint64_t	lock_owner;
7724c82456eSMiklos Szeredi 	uint64_t	atime;
7734c82456eSMiklos Szeredi 	uint64_t	mtime;
774ab9e13f7SMaxim Patlasov 	uint64_t	ctime;
7754c82456eSMiklos Szeredi 	uint32_t	atimensec;
7764c82456eSMiklos Szeredi 	uint32_t	mtimensec;
777ab9e13f7SMaxim Patlasov 	uint32_t	ctimensec;
7784c82456eSMiklos Szeredi 	uint32_t	mode;
7794c82456eSMiklos Szeredi 	uint32_t	unused4;
7804c82456eSMiklos Szeredi 	uint32_t	uid;
7814c82456eSMiklos Szeredi 	uint32_t	gid;
7824c82456eSMiklos Szeredi 	uint32_t	unused5;
783607ca46eSDavid Howells };
784607ca46eSDavid Howells 
785607ca46eSDavid Howells struct fuse_open_in {
7864c82456eSMiklos Szeredi 	uint32_t	flags;
787643a666aSVivek Goyal 	uint32_t	open_flags;	/* FUSE_OPEN_... */
788607ca46eSDavid Howells };
789607ca46eSDavid Howells 
790607ca46eSDavid Howells struct fuse_create_in {
7914c82456eSMiklos Szeredi 	uint32_t	flags;
7924c82456eSMiklos Szeredi 	uint32_t	mode;
7934c82456eSMiklos Szeredi 	uint32_t	umask;
794643a666aSVivek Goyal 	uint32_t	open_flags;	/* FUSE_OPEN_... */
795607ca46eSDavid Howells };
796607ca46eSDavid Howells 
797607ca46eSDavid Howells struct fuse_open_out {
7984c82456eSMiklos Szeredi 	uint64_t	fh;
7994c82456eSMiklos Szeredi 	uint32_t	open_flags;
8007dc4e97aSAmir Goldstein 	int32_t		backing_id;
801607ca46eSDavid Howells };
802607ca46eSDavid Howells 
803607ca46eSDavid Howells struct fuse_release_in {
8044c82456eSMiklos Szeredi 	uint64_t	fh;
8054c82456eSMiklos Szeredi 	uint32_t	flags;
8064c82456eSMiklos Szeredi 	uint32_t	release_flags;
8074c82456eSMiklos Szeredi 	uint64_t	lock_owner;
808607ca46eSDavid Howells };
809607ca46eSDavid Howells 
810607ca46eSDavid Howells struct fuse_flush_in {
8114c82456eSMiklos Szeredi 	uint64_t	fh;
8124c82456eSMiklos Szeredi 	uint32_t	unused;
8134c82456eSMiklos Szeredi 	uint32_t	padding;
8144c82456eSMiklos Szeredi 	uint64_t	lock_owner;
815607ca46eSDavid Howells };
816607ca46eSDavid Howells 
817607ca46eSDavid Howells struct fuse_read_in {
8184c82456eSMiklos Szeredi 	uint64_t	fh;
8194c82456eSMiklos Szeredi 	uint64_t	offset;
8204c82456eSMiklos Szeredi 	uint32_t	size;
8214c82456eSMiklos Szeredi 	uint32_t	read_flags;
8224c82456eSMiklos Szeredi 	uint64_t	lock_owner;
8234c82456eSMiklos Szeredi 	uint32_t	flags;
8244c82456eSMiklos Szeredi 	uint32_t	padding;
825607ca46eSDavid Howells };
826607ca46eSDavid Howells 
827607ca46eSDavid Howells #define FUSE_COMPAT_WRITE_IN_SIZE 24
828607ca46eSDavid Howells 
829607ca46eSDavid Howells struct fuse_write_in {
8304c82456eSMiklos Szeredi 	uint64_t	fh;
8314c82456eSMiklos Szeredi 	uint64_t	offset;
8324c82456eSMiklos Szeredi 	uint32_t	size;
8334c82456eSMiklos Szeredi 	uint32_t	write_flags;
8344c82456eSMiklos Szeredi 	uint64_t	lock_owner;
8354c82456eSMiklos Szeredi 	uint32_t	flags;
8364c82456eSMiklos Szeredi 	uint32_t	padding;
837607ca46eSDavid Howells };
838607ca46eSDavid Howells 
839607ca46eSDavid Howells struct fuse_write_out {
8404c82456eSMiklos Szeredi 	uint32_t	size;
8414c82456eSMiklos Szeredi 	uint32_t	padding;
842607ca46eSDavid Howells };
843607ca46eSDavid Howells 
844607ca46eSDavid Howells #define FUSE_COMPAT_STATFS_SIZE 48
845607ca46eSDavid Howells 
846607ca46eSDavid Howells struct fuse_statfs_out {
847607ca46eSDavid Howells 	struct fuse_kstatfs st;
848607ca46eSDavid Howells };
849607ca46eSDavid Howells 
850607ca46eSDavid Howells struct fuse_fsync_in {
8514c82456eSMiklos Szeredi 	uint64_t	fh;
8524c82456eSMiklos Szeredi 	uint32_t	fsync_flags;
8534c82456eSMiklos Szeredi 	uint32_t	padding;
854607ca46eSDavid Howells };
855607ca46eSDavid Howells 
85652a4c95fSVivek Goyal #define FUSE_COMPAT_SETXATTR_IN_SIZE 8
85752a4c95fSVivek Goyal 
858607ca46eSDavid Howells struct fuse_setxattr_in {
8594c82456eSMiklos Szeredi 	uint32_t	size;
8604c82456eSMiklos Szeredi 	uint32_t	flags;
86152a4c95fSVivek Goyal 	uint32_t	setxattr_flags;
86252a4c95fSVivek Goyal 	uint32_t	padding;
863607ca46eSDavid Howells };
864607ca46eSDavid Howells 
865607ca46eSDavid Howells struct fuse_getxattr_in {
8664c82456eSMiklos Szeredi 	uint32_t	size;
8674c82456eSMiklos Szeredi 	uint32_t	padding;
868607ca46eSDavid Howells };
869607ca46eSDavid Howells 
870607ca46eSDavid Howells struct fuse_getxattr_out {
8714c82456eSMiklos Szeredi 	uint32_t	size;
8724c82456eSMiklos Szeredi 	uint32_t	padding;
873607ca46eSDavid Howells };
874607ca46eSDavid Howells 
875607ca46eSDavid Howells struct fuse_lk_in {
8764c82456eSMiklos Szeredi 	uint64_t	fh;
8774c82456eSMiklos Szeredi 	uint64_t	owner;
878607ca46eSDavid Howells 	struct fuse_file_lock lk;
8794c82456eSMiklos Szeredi 	uint32_t	lk_flags;
8804c82456eSMiklos Szeredi 	uint32_t	padding;
881607ca46eSDavid Howells };
882607ca46eSDavid Howells 
883607ca46eSDavid Howells struct fuse_lk_out {
884607ca46eSDavid Howells 	struct fuse_file_lock lk;
885607ca46eSDavid Howells };
886607ca46eSDavid Howells 
887607ca46eSDavid Howells struct fuse_access_in {
8884c82456eSMiklos Szeredi 	uint32_t	mask;
8894c82456eSMiklos Szeredi 	uint32_t	padding;
890607ca46eSDavid Howells };
891607ca46eSDavid Howells 
892607ca46eSDavid Howells struct fuse_init_in {
8934c82456eSMiklos Szeredi 	uint32_t	major;
8944c82456eSMiklos Szeredi 	uint32_t	minor;
8954c82456eSMiklos Szeredi 	uint32_t	max_readahead;
8964c82456eSMiklos Szeredi 	uint32_t	flags;
89753db2893SMiklos Szeredi 	uint32_t	flags2;
89853db2893SMiklos Szeredi 	uint32_t	unused[11];
899607ca46eSDavid Howells };
900607ca46eSDavid Howells 
901e27c9d38SMiklos Szeredi #define FUSE_COMPAT_INIT_OUT_SIZE 8
902e27c9d38SMiklos Szeredi #define FUSE_COMPAT_22_INIT_OUT_SIZE 24
903e27c9d38SMiklos Szeredi 
904607ca46eSDavid Howells struct fuse_init_out {
9054c82456eSMiklos Szeredi 	uint32_t	major;
9064c82456eSMiklos Szeredi 	uint32_t	minor;
9074c82456eSMiklos Szeredi 	uint32_t	max_readahead;
9084c82456eSMiklos Szeredi 	uint32_t	flags;
9094c82456eSMiklos Szeredi 	uint16_t	max_background;
9104c82456eSMiklos Szeredi 	uint16_t	congestion_threshold;
9114c82456eSMiklos Szeredi 	uint32_t	max_write;
912e27c9d38SMiklos Szeredi 	uint32_t	time_gran;
9135da784ccSConstantine Shulyupin 	uint16_t	max_pages;
914c4bb667eSDr. David Alan Gilbert 	uint16_t	map_alignment;
91553db2893SMiklos Szeredi 	uint32_t	flags2;
9167dc4e97aSAmir Goldstein 	uint32_t	max_stack_depth;
917*0f6439f6SJoanne Koong 	uint16_t	request_timeout;
918*0f6439f6SJoanne Koong 	uint16_t	unused[11];
919607ca46eSDavid Howells };
920607ca46eSDavid Howells 
921607ca46eSDavid Howells #define CUSE_INIT_INFO_MAX 4096
922607ca46eSDavid Howells 
923607ca46eSDavid Howells struct cuse_init_in {
9244c82456eSMiklos Szeredi 	uint32_t	major;
9254c82456eSMiklos Szeredi 	uint32_t	minor;
9264c82456eSMiklos Szeredi 	uint32_t	unused;
9274c82456eSMiklos Szeredi 	uint32_t	flags;
928607ca46eSDavid Howells };
929607ca46eSDavid Howells 
930607ca46eSDavid Howells struct cuse_init_out {
9314c82456eSMiklos Szeredi 	uint32_t	major;
9324c82456eSMiklos Szeredi 	uint32_t	minor;
9334c82456eSMiklos Szeredi 	uint32_t	unused;
9344c82456eSMiklos Szeredi 	uint32_t	flags;
9354c82456eSMiklos Szeredi 	uint32_t	max_read;
9364c82456eSMiklos Szeredi 	uint32_t	max_write;
9374c82456eSMiklos Szeredi 	uint32_t	dev_major;		/* chardev major */
9384c82456eSMiklos Szeredi 	uint32_t	dev_minor;		/* chardev minor */
9394c82456eSMiklos Szeredi 	uint32_t	spare[10];
940607ca46eSDavid Howells };
941607ca46eSDavid Howells 
942607ca46eSDavid Howells struct fuse_interrupt_in {
9434c82456eSMiklos Szeredi 	uint64_t	unique;
944607ca46eSDavid Howells };
945607ca46eSDavid Howells 
946607ca46eSDavid Howells struct fuse_bmap_in {
9474c82456eSMiklos Szeredi 	uint64_t	block;
9484c82456eSMiklos Szeredi 	uint32_t	blocksize;
9494c82456eSMiklos Szeredi 	uint32_t	padding;
950607ca46eSDavid Howells };
951607ca46eSDavid Howells 
952607ca46eSDavid Howells struct fuse_bmap_out {
9534c82456eSMiklos Szeredi 	uint64_t	block;
954607ca46eSDavid Howells };
955607ca46eSDavid Howells 
956607ca46eSDavid Howells struct fuse_ioctl_in {
9574c82456eSMiklos Szeredi 	uint64_t	fh;
9584c82456eSMiklos Szeredi 	uint32_t	flags;
9594c82456eSMiklos Szeredi 	uint32_t	cmd;
9604c82456eSMiklos Szeredi 	uint64_t	arg;
9614c82456eSMiklos Szeredi 	uint32_t	in_size;
9624c82456eSMiklos Szeredi 	uint32_t	out_size;
963607ca46eSDavid Howells };
964607ca46eSDavid Howells 
965607ca46eSDavid Howells struct fuse_ioctl_iovec {
9664c82456eSMiklos Szeredi 	uint64_t	base;
9674c82456eSMiklos Szeredi 	uint64_t	len;
968607ca46eSDavid Howells };
969607ca46eSDavid Howells 
970607ca46eSDavid Howells struct fuse_ioctl_out {
9714c82456eSMiklos Szeredi 	int32_t		result;
9724c82456eSMiklos Szeredi 	uint32_t	flags;
9734c82456eSMiklos Szeredi 	uint32_t	in_iovs;
9744c82456eSMiklos Szeredi 	uint32_t	out_iovs;
975607ca46eSDavid Howells };
976607ca46eSDavid Howells 
977607ca46eSDavid Howells struct fuse_poll_in {
9784c82456eSMiklos Szeredi 	uint64_t	fh;
9794c82456eSMiklos Szeredi 	uint64_t	kh;
9804c82456eSMiklos Szeredi 	uint32_t	flags;
9814c82456eSMiklos Szeredi 	uint32_t	events;
982607ca46eSDavid Howells };
983607ca46eSDavid Howells 
984607ca46eSDavid Howells struct fuse_poll_out {
9854c82456eSMiklos Szeredi 	uint32_t	revents;
9864c82456eSMiklos Szeredi 	uint32_t	padding;
987607ca46eSDavid Howells };
988607ca46eSDavid Howells 
989607ca46eSDavid Howells struct fuse_notify_poll_wakeup_out {
9904c82456eSMiklos Szeredi 	uint64_t	kh;
991607ca46eSDavid Howells };
992607ca46eSDavid Howells 
993607ca46eSDavid Howells struct fuse_fallocate_in {
9944c82456eSMiklos Szeredi 	uint64_t	fh;
9954c82456eSMiklos Szeredi 	uint64_t	offset;
9964c82456eSMiklos Szeredi 	uint64_t	length;
9974c82456eSMiklos Szeredi 	uint32_t	mode;
9984c82456eSMiklos Szeredi 	uint32_t	padding;
999607ca46eSDavid Howells };
1000607ca46eSDavid Howells 
10019e7f5296SZhao Chen /**
10029e7f5296SZhao Chen  * FUSE request unique ID flag
10039e7f5296SZhao Chen  *
10049e7f5296SZhao Chen  * Indicates whether this is a resend request. The receiver should handle this
10059e7f5296SZhao Chen  * request accordingly.
10069e7f5296SZhao Chen  */
10079e7f5296SZhao Chen #define FUSE_UNIQUE_RESEND (1ULL << 63)
10089e7f5296SZhao Chen 
100916e1503eSAlexander Mikhalitsyn /**
101016e1503eSAlexander Mikhalitsyn  * This value will be set by the kernel to
101116e1503eSAlexander Mikhalitsyn  * (struct fuse_in_header).{uid,gid} fields in
101216e1503eSAlexander Mikhalitsyn  * case when:
101316e1503eSAlexander Mikhalitsyn  * - fuse daemon enabled FUSE_ALLOW_IDMAP
101416e1503eSAlexander Mikhalitsyn  * - idmapping information is not available and uid/gid
101516e1503eSAlexander Mikhalitsyn  *   can not be mapped in accordance with an idmapping.
101616e1503eSAlexander Mikhalitsyn  *
101716e1503eSAlexander Mikhalitsyn  * Note: an idmapping information always available
101816e1503eSAlexander Mikhalitsyn  * for inode creation operations like:
101916e1503eSAlexander Mikhalitsyn  * FUSE_MKNOD, FUSE_SYMLINK, FUSE_MKDIR, FUSE_TMPFILE,
102016e1503eSAlexander Mikhalitsyn  * FUSE_CREATE and FUSE_RENAME2 (with RENAME_WHITEOUT).
102116e1503eSAlexander Mikhalitsyn  */
1022aa16880dSAlexander Mikhalitsyn #define FUSE_INVALID_UIDGID ((uint32_t)(-1))
1023aa16880dSAlexander Mikhalitsyn 
1024607ca46eSDavid Howells struct fuse_in_header {
10254c82456eSMiklos Szeredi 	uint32_t	len;
10264c82456eSMiklos Szeredi 	uint32_t	opcode;
10274c82456eSMiklos Szeredi 	uint64_t	unique;
10284c82456eSMiklos Szeredi 	uint64_t	nodeid;
10294c82456eSMiklos Szeredi 	uint32_t	uid;
10304c82456eSMiklos Szeredi 	uint32_t	gid;
10314c82456eSMiklos Szeredi 	uint32_t	pid;
103215d937d7SMiklos Szeredi 	uint16_t	total_extlen; /* length of extensions in 8byte units */
103315d937d7SMiklos Szeredi 	uint16_t	padding;
1034607ca46eSDavid Howells };
1035607ca46eSDavid Howells 
1036607ca46eSDavid Howells struct fuse_out_header {
10374c82456eSMiklos Szeredi 	uint32_t	len;
10384c82456eSMiklos Szeredi 	int32_t		error;
10394c82456eSMiklos Szeredi 	uint64_t	unique;
1040607ca46eSDavid Howells };
1041607ca46eSDavid Howells 
1042607ca46eSDavid Howells struct fuse_dirent {
10434c82456eSMiklos Szeredi 	uint64_t	ino;
10444c82456eSMiklos Szeredi 	uint64_t	off;
10454c82456eSMiklos Szeredi 	uint32_t	namelen;
10464c82456eSMiklos Szeredi 	uint32_t	type;
1047607ca46eSDavid Howells 	char name[];
1048607ca46eSDavid Howells };
1049607ca46eSDavid Howells 
10503e2b6fdbSVivek Goyal /* Align variable length records to 64bit boundary */
10513e2b6fdbSVivek Goyal #define FUSE_REC_ALIGN(x) \
10524c82456eSMiklos Szeredi 	(((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
10533e2b6fdbSVivek Goyal 
10543e2b6fdbSVivek Goyal #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
10553e2b6fdbSVivek Goyal #define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x)
1056607ca46eSDavid Howells #define FUSE_DIRENT_SIZE(d) \
1057607ca46eSDavid Howells 	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
1058607ca46eSDavid Howells 
10590b05b183SAnand V. Avati struct fuse_direntplus {
10600b05b183SAnand V. Avati 	struct fuse_entry_out entry_out;
10610b05b183SAnand V. Avati 	struct fuse_dirent dirent;
10620b05b183SAnand V. Avati };
10630b05b183SAnand V. Avati 
10640b05b183SAnand V. Avati #define FUSE_NAME_OFFSET_DIRENTPLUS \
10650b05b183SAnand V. Avati 	offsetof(struct fuse_direntplus, dirent.name)
10660b05b183SAnand V. Avati #define FUSE_DIRENTPLUS_SIZE(d) \
10670b05b183SAnand V. Avati 	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
10680b05b183SAnand V. Avati 
1069607ca46eSDavid Howells struct fuse_notify_inval_inode_out {
10704c82456eSMiklos Szeredi 	uint64_t	ino;
10714c82456eSMiklos Szeredi 	int64_t		off;
10724c82456eSMiklos Szeredi 	int64_t		len;
1073607ca46eSDavid Howells };
1074607ca46eSDavid Howells 
1075607ca46eSDavid Howells struct fuse_notify_inval_entry_out {
10764c82456eSMiklos Szeredi 	uint64_t	parent;
10774c82456eSMiklos Szeredi 	uint32_t	namelen;
10784f8d3702SMiklos Szeredi 	uint32_t	flags;
1079607ca46eSDavid Howells };
1080607ca46eSDavid Howells 
1081607ca46eSDavid Howells struct fuse_notify_delete_out {
10824c82456eSMiklos Szeredi 	uint64_t	parent;
10834c82456eSMiklos Szeredi 	uint64_t	child;
10844c82456eSMiklos Szeredi 	uint32_t	namelen;
10854c82456eSMiklos Szeredi 	uint32_t	padding;
1086607ca46eSDavid Howells };
1087607ca46eSDavid Howells 
1088607ca46eSDavid Howells struct fuse_notify_store_out {
10894c82456eSMiklos Szeredi 	uint64_t	nodeid;
10904c82456eSMiklos Szeredi 	uint64_t	offset;
10914c82456eSMiklos Szeredi 	uint32_t	size;
10924c82456eSMiklos Szeredi 	uint32_t	padding;
1093607ca46eSDavid Howells };
1094607ca46eSDavid Howells 
1095607ca46eSDavid Howells struct fuse_notify_retrieve_out {
10964c82456eSMiklos Szeredi 	uint64_t	notify_unique;
10974c82456eSMiklos Szeredi 	uint64_t	nodeid;
10984c82456eSMiklos Szeredi 	uint64_t	offset;
10994c82456eSMiklos Szeredi 	uint32_t	size;
11004c82456eSMiklos Szeredi 	uint32_t	padding;
1101607ca46eSDavid Howells };
1102607ca46eSDavid Howells 
1103607ca46eSDavid Howells /* Matches the size of fuse_write_in */
1104607ca46eSDavid Howells struct fuse_notify_retrieve_in {
11054c82456eSMiklos Szeredi 	uint64_t	dummy1;
11064c82456eSMiklos Szeredi 	uint64_t	offset;
11074c82456eSMiklos Szeredi 	uint32_t	size;
11084c82456eSMiklos Szeredi 	uint32_t	dummy2;
11094c82456eSMiklos Szeredi 	uint64_t	dummy3;
11104c82456eSMiklos Szeredi 	uint64_t	dummy4;
1111607ca46eSDavid Howells };
1112607ca46eSDavid Howells 
111344350256SAmir Goldstein struct fuse_backing_map {
111444350256SAmir Goldstein 	int32_t		fd;
111544350256SAmir Goldstein 	uint32_t	flags;
111644350256SAmir Goldstein 	uint64_t	padding;
111744350256SAmir Goldstein };
111844350256SAmir Goldstein 
111900c570f4SMiklos Szeredi /* Device ioctls: */
1120f8425c93SAlessio Balsini #define FUSE_DEV_IOC_MAGIC		229
1121f8425c93SAlessio Balsini #define FUSE_DEV_IOC_CLONE		_IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
112244350256SAmir Goldstein #define FUSE_DEV_IOC_BACKING_OPEN	_IOW(FUSE_DEV_IOC_MAGIC, 1, \
112344350256SAmir Goldstein 					     struct fuse_backing_map)
112444350256SAmir Goldstein #define FUSE_DEV_IOC_BACKING_CLOSE	_IOW(FUSE_DEV_IOC_MAGIC, 2, uint32_t)
112500c570f4SMiklos Szeredi 
11260b5da8dbSRavishankar N struct fuse_lseek_in {
11270b5da8dbSRavishankar N 	uint64_t	fh;
11280b5da8dbSRavishankar N 	uint64_t	offset;
11290b5da8dbSRavishankar N 	uint32_t	whence;
11300b5da8dbSRavishankar N 	uint32_t	padding;
11310b5da8dbSRavishankar N };
11320b5da8dbSRavishankar N 
11330b5da8dbSRavishankar N struct fuse_lseek_out {
11340b5da8dbSRavishankar N 	uint64_t	offset;
11350b5da8dbSRavishankar N };
11360b5da8dbSRavishankar N 
113788bc7d50SNiels de Vos struct fuse_copy_file_range_in {
113888bc7d50SNiels de Vos 	uint64_t	fh_in;
113988bc7d50SNiels de Vos 	uint64_t	off_in;
114088bc7d50SNiels de Vos 	uint64_t	nodeid_out;
114188bc7d50SNiels de Vos 	uint64_t	fh_out;
114288bc7d50SNiels de Vos 	uint64_t	off_out;
114388bc7d50SNiels de Vos 	uint64_t	len;
114488bc7d50SNiels de Vos 	uint64_t	flags;
114588bc7d50SNiels de Vos };
114688bc7d50SNiels de Vos 
1147ceec02d4SVivek Goyal #define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
1148c2d0ad00SVivek Goyal #define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
1149ceec02d4SVivek Goyal struct fuse_setupmapping_in {
1150ceec02d4SVivek Goyal 	/* An already open handle */
1151ceec02d4SVivek Goyal 	uint64_t	fh;
1152ceec02d4SVivek Goyal 	/* Offset into the file to start the mapping */
1153ceec02d4SVivek Goyal 	uint64_t	foffset;
1154ceec02d4SVivek Goyal 	/* Length of mapping required */
1155ceec02d4SVivek Goyal 	uint64_t	len;
1156ceec02d4SVivek Goyal 	/* Flags, FUSE_SETUPMAPPING_FLAG_* */
1157ceec02d4SVivek Goyal 	uint64_t	flags;
1158ceec02d4SVivek Goyal 	/* Offset in Memory Window */
1159ceec02d4SVivek Goyal 	uint64_t	moffset;
1160ceec02d4SVivek Goyal };
1161ceec02d4SVivek Goyal 
1162ceec02d4SVivek Goyal struct fuse_removemapping_in {
1163ceec02d4SVivek Goyal 	/* number of fuse_removemapping_one follows */
1164ceec02d4SVivek Goyal 	uint32_t        count;
1165ceec02d4SVivek Goyal };
1166ceec02d4SVivek Goyal 
1167ceec02d4SVivek Goyal struct fuse_removemapping_one {
1168ceec02d4SVivek Goyal 	/* Offset into the dax window start the unmapping */
1169ceec02d4SVivek Goyal 	uint64_t        moffset;
1170ceec02d4SVivek Goyal 	/* Length of mapping required */
1171ceec02d4SVivek Goyal 	uint64_t	len;
1172ceec02d4SVivek Goyal };
1173ceec02d4SVivek Goyal 
1174ceec02d4SVivek Goyal #define FUSE_REMOVEMAPPING_MAX_ENTRY   \
1175ceec02d4SVivek Goyal 		(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
1176ceec02d4SVivek Goyal 
11772d82ab25SGreg Kurz struct fuse_syncfs_in {
11782d82ab25SGreg Kurz 	uint64_t	padding;
11792d82ab25SGreg Kurz };
11802d82ab25SGreg Kurz 
11813e2b6fdbSVivek Goyal /*
11823e2b6fdbSVivek Goyal  * For each security context, send fuse_secctx with size of security context
11833e2b6fdbSVivek Goyal  * fuse_secctx will be followed by security context name and this in turn
11843e2b6fdbSVivek Goyal  * will be followed by actual context label.
11853e2b6fdbSVivek Goyal  * fuse_secctx, name, context
11863e2b6fdbSVivek Goyal  */
11873e2b6fdbSVivek Goyal struct fuse_secctx {
11883e2b6fdbSVivek Goyal 	uint32_t	size;
11893e2b6fdbSVivek Goyal 	uint32_t	padding;
11903e2b6fdbSVivek Goyal };
11913e2b6fdbSVivek Goyal 
11923e2b6fdbSVivek Goyal /*
11933e2b6fdbSVivek Goyal  * Contains the information about how many fuse_secctx structures are being
11943e2b6fdbSVivek Goyal  * sent and what's the total size of all security contexts (including
11953e2b6fdbSVivek Goyal  * size of fuse_secctx_header).
11963e2b6fdbSVivek Goyal  *
11973e2b6fdbSVivek Goyal  */
11983e2b6fdbSVivek Goyal struct fuse_secctx_header {
11993e2b6fdbSVivek Goyal 	uint32_t	size;
12003e2b6fdbSVivek Goyal 	uint32_t	nr_secctx;
12013e2b6fdbSVivek Goyal };
12023e2b6fdbSVivek Goyal 
120315d937d7SMiklos Szeredi /**
120415d937d7SMiklos Szeredi  * struct fuse_ext_header - extension header
120515d937d7SMiklos Szeredi  * @size: total size of this extension including this header
120615d937d7SMiklos Szeredi  * @type: type of extension
120715d937d7SMiklos Szeredi  *
120815d937d7SMiklos Szeredi  * This is made compatible with fuse_secctx_header by using type values >
120915d937d7SMiklos Szeredi  * FUSE_MAX_NR_SECCTX
121015d937d7SMiklos Szeredi  */
121115d937d7SMiklos Szeredi struct fuse_ext_header {
121215d937d7SMiklos Szeredi 	uint32_t	size;
121315d937d7SMiklos Szeredi 	uint32_t	type;
121415d937d7SMiklos Szeredi };
121515d937d7SMiklos Szeredi 
12168ed7cb3fSMiklos Szeredi /**
12178ed7cb3fSMiklos Szeredi  * struct fuse_supp_groups - Supplementary group extension
12188ed7cb3fSMiklos Szeredi  * @nr_groups: number of supplementary groups
12198ed7cb3fSMiklos Szeredi  * @groups: flexible array of group IDs
12208ed7cb3fSMiklos Szeredi  */
12218ed7cb3fSMiklos Szeredi struct fuse_supp_groups {
12228ed7cb3fSMiklos Szeredi 	uint32_t	nr_groups;
12238ed7cb3fSMiklos Szeredi 	uint32_t	groups[];
12248ed7cb3fSMiklos Szeredi };
12258ed7cb3fSMiklos Szeredi 
122624fe962cSBernd Schubert /**
122724fe962cSBernd Schubert  * Size of the ring buffer header
122824fe962cSBernd Schubert  */
122924fe962cSBernd Schubert #define FUSE_URING_IN_OUT_HEADER_SZ 128
123024fe962cSBernd Schubert #define FUSE_URING_OP_IN_OUT_SZ 128
123124fe962cSBernd Schubert 
123224fe962cSBernd Schubert /* Used as part of the fuse_uring_req_header */
123324fe962cSBernd Schubert struct fuse_uring_ent_in_out {
123424fe962cSBernd Schubert 	uint64_t flags;
123524fe962cSBernd Schubert 
123624fe962cSBernd Schubert 	/*
123724fe962cSBernd Schubert 	 * commit ID to be used in a reply to a ring request (see also
123824fe962cSBernd Schubert 	 * struct fuse_uring_cmd_req)
123924fe962cSBernd Schubert 	 */
124024fe962cSBernd Schubert 	uint64_t commit_id;
124124fe962cSBernd Schubert 
124224fe962cSBernd Schubert 	/* size of user payload buffer */
124324fe962cSBernd Schubert 	uint32_t payload_sz;
124424fe962cSBernd Schubert 	uint32_t padding;
124524fe962cSBernd Schubert 
124624fe962cSBernd Schubert 	uint64_t reserved;
124724fe962cSBernd Schubert };
124824fe962cSBernd Schubert 
124924fe962cSBernd Schubert /**
125024fe962cSBernd Schubert  * Header for all fuse-io-uring requests
125124fe962cSBernd Schubert  */
125224fe962cSBernd Schubert struct fuse_uring_req_header {
125324fe962cSBernd Schubert 	/* struct fuse_in_header / struct fuse_out_header */
125424fe962cSBernd Schubert 	char in_out[FUSE_URING_IN_OUT_HEADER_SZ];
125524fe962cSBernd Schubert 
125624fe962cSBernd Schubert 	/* per op code header */
125724fe962cSBernd Schubert 	char op_in[FUSE_URING_OP_IN_OUT_SZ];
125824fe962cSBernd Schubert 
125924fe962cSBernd Schubert 	struct fuse_uring_ent_in_out ring_ent_in_out;
126024fe962cSBernd Schubert };
126124fe962cSBernd Schubert 
126224fe962cSBernd Schubert /**
126324fe962cSBernd Schubert  * sqe commands to the kernel
126424fe962cSBernd Schubert  */
126524fe962cSBernd Schubert enum fuse_uring_cmd {
126624fe962cSBernd Schubert 	FUSE_IO_URING_CMD_INVALID = 0,
126724fe962cSBernd Schubert 
126824fe962cSBernd Schubert 	/* register the request buffer and fetch a fuse request */
126924fe962cSBernd Schubert 	FUSE_IO_URING_CMD_REGISTER = 1,
127024fe962cSBernd Schubert 
127124fe962cSBernd Schubert 	/* commit fuse request result and fetch next request */
127224fe962cSBernd Schubert 	FUSE_IO_URING_CMD_COMMIT_AND_FETCH = 2,
127324fe962cSBernd Schubert };
127424fe962cSBernd Schubert 
127524fe962cSBernd Schubert /**
127624fe962cSBernd Schubert  * In the 80B command area of the SQE.
127724fe962cSBernd Schubert  */
127824fe962cSBernd Schubert struct fuse_uring_cmd_req {
127924fe962cSBernd Schubert 	uint64_t flags;
128024fe962cSBernd Schubert 
128124fe962cSBernd Schubert 	/* entry identifier for commits */
128224fe962cSBernd Schubert 	uint64_t commit_id;
128324fe962cSBernd Schubert 
128424fe962cSBernd Schubert 	/* queue the command is for (queue index) */
128524fe962cSBernd Schubert 	uint16_t qid;
128624fe962cSBernd Schubert 	uint8_t padding[6];
128724fe962cSBernd Schubert };
128824fe962cSBernd Schubert 
1289607ca46eSDavid Howells #endif /* _LINUX_FUSE_H */
1290