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