xref: /aosp_15_r20/external/libfuse/include/fuse_common.h (revision 9e5649576b786774a32d7b0252c9cd8c6538fa49)
1*9e564957SAndroid Build Coastguard Worker /*  FUSE: Filesystem in Userspace
2*9e564957SAndroid Build Coastguard Worker   Copyright (C) 2001-2007  Miklos Szeredi <[email protected]>
3*9e564957SAndroid Build Coastguard Worker 
4*9e564957SAndroid Build Coastguard Worker   This program can be distributed under the terms of the GNU LGPLv2.
5*9e564957SAndroid Build Coastguard Worker   See the file COPYING.LIB.
6*9e564957SAndroid Build Coastguard Worker */
7*9e564957SAndroid Build Coastguard Worker 
8*9e564957SAndroid Build Coastguard Worker /** @file */
9*9e564957SAndroid Build Coastguard Worker 
10*9e564957SAndroid Build Coastguard Worker #if !defined(FUSE_H_) && !defined(FUSE_LOWLEVEL_H_)
11*9e564957SAndroid Build Coastguard Worker #error "Never include <fuse_common.h> directly; use <fuse.h> or <fuse_lowlevel.h> instead."
12*9e564957SAndroid Build Coastguard Worker #endif
13*9e564957SAndroid Build Coastguard Worker 
14*9e564957SAndroid Build Coastguard Worker #ifndef FUSE_COMMON_H_
15*9e564957SAndroid Build Coastguard Worker #define FUSE_COMMON_H_
16*9e564957SAndroid Build Coastguard Worker 
17*9e564957SAndroid Build Coastguard Worker #ifdef HAVE_LIBFUSE_PRIVATE_CONFIG_H
18*9e564957SAndroid Build Coastguard Worker #include "fuse_config.h"
19*9e564957SAndroid Build Coastguard Worker #endif
20*9e564957SAndroid Build Coastguard Worker 
21*9e564957SAndroid Build Coastguard Worker #include "libfuse_config.h"
22*9e564957SAndroid Build Coastguard Worker 
23*9e564957SAndroid Build Coastguard Worker #include "fuse_opt.h"
24*9e564957SAndroid Build Coastguard Worker #include "fuse_log.h"
25*9e564957SAndroid Build Coastguard Worker #include <stdint.h>
26*9e564957SAndroid Build Coastguard Worker #include <sys/types.h>
27*9e564957SAndroid Build Coastguard Worker 
28*9e564957SAndroid Build Coastguard Worker #define FUSE_MAKE_VERSION(maj, min)  ((maj) * 100 + (min))
29*9e564957SAndroid Build Coastguard Worker #define FUSE_VERSION FUSE_MAKE_VERSION(FUSE_MAJOR_VERSION, FUSE_MINOR_VERSION)
30*9e564957SAndroid Build Coastguard Worker 
31*9e564957SAndroid Build Coastguard Worker #ifdef __cplusplus
32*9e564957SAndroid Build Coastguard Worker extern "C" {
33*9e564957SAndroid Build Coastguard Worker #endif
34*9e564957SAndroid Build Coastguard Worker 
35*9e564957SAndroid Build Coastguard Worker /**
36*9e564957SAndroid Build Coastguard Worker  * Information about an open file.
37*9e564957SAndroid Build Coastguard Worker  *
38*9e564957SAndroid Build Coastguard Worker  * File Handles are created by the open, opendir, and create methods and closed
39*9e564957SAndroid Build Coastguard Worker  * by the release and releasedir methods.  Multiple file handles may be
40*9e564957SAndroid Build Coastguard Worker  * concurrently open for the same file.  Generally, a client will create one
41*9e564957SAndroid Build Coastguard Worker  * file handle per file descriptor, though in some cases multiple file
42*9e564957SAndroid Build Coastguard Worker  * descriptors can share a single file handle.
43*9e564957SAndroid Build Coastguard Worker  */
44*9e564957SAndroid Build Coastguard Worker struct fuse_file_info {
45*9e564957SAndroid Build Coastguard Worker 	/** Open flags.	 Available in open(), release() and create() */
46*9e564957SAndroid Build Coastguard Worker 	int flags;
47*9e564957SAndroid Build Coastguard Worker 
48*9e564957SAndroid Build Coastguard Worker 	/** In case of a write operation indicates if this was caused
49*9e564957SAndroid Build Coastguard Worker 	    by a delayed write from the page cache. If so, then the
50*9e564957SAndroid Build Coastguard Worker 	    context's pid, uid, and gid fields will not be valid, and
51*9e564957SAndroid Build Coastguard Worker 	    the *fh* value may not match the *fh* value that would
52*9e564957SAndroid Build Coastguard Worker 	    have been sent with the corresponding individual write
53*9e564957SAndroid Build Coastguard Worker 	    requests if write caching had been disabled. */
54*9e564957SAndroid Build Coastguard Worker 	unsigned int writepage : 1;
55*9e564957SAndroid Build Coastguard Worker 
56*9e564957SAndroid Build Coastguard Worker 	/** Can be filled in by open/create, to use direct I/O on this file. */
57*9e564957SAndroid Build Coastguard Worker 	unsigned int direct_io : 1;
58*9e564957SAndroid Build Coastguard Worker 
59*9e564957SAndroid Build Coastguard Worker 	/** Can be filled in by open and opendir. It signals the kernel that any
60*9e564957SAndroid Build Coastguard Worker 	    currently cached data (ie., data that the filesystem provided the
61*9e564957SAndroid Build Coastguard Worker 	    last time the file/directory was open) need not be invalidated when
62*9e564957SAndroid Build Coastguard Worker 	    the file/directory is closed. */
63*9e564957SAndroid Build Coastguard Worker 	unsigned int keep_cache : 1;
64*9e564957SAndroid Build Coastguard Worker 
65*9e564957SAndroid Build Coastguard Worker 	/** Can be filled by open/create, to allow parallel direct writes on this
66*9e564957SAndroid Build Coastguard Worker          *  file */
67*9e564957SAndroid Build Coastguard Worker         unsigned int parallel_direct_writes : 1;
68*9e564957SAndroid Build Coastguard Worker 
69*9e564957SAndroid Build Coastguard Worker 	/** Indicates a flush operation.  Set in flush operation, also
70*9e564957SAndroid Build Coastguard Worker 	    maybe set in highlevel lock operation and lowlevel release
71*9e564957SAndroid Build Coastguard Worker 	    operation. */
72*9e564957SAndroid Build Coastguard Worker 	unsigned int flush : 1;
73*9e564957SAndroid Build Coastguard Worker 
74*9e564957SAndroid Build Coastguard Worker 	/** Can be filled in by open, to indicate that the file is not
75*9e564957SAndroid Build Coastguard Worker 	    seekable. */
76*9e564957SAndroid Build Coastguard Worker 	unsigned int nonseekable : 1;
77*9e564957SAndroid Build Coastguard Worker 
78*9e564957SAndroid Build Coastguard Worker 	/* Indicates that flock locks for this file should be
79*9e564957SAndroid Build Coastguard Worker 	   released.  If set, lock_owner shall contain a valid value.
80*9e564957SAndroid Build Coastguard Worker 	   May only be set in ->release(). */
81*9e564957SAndroid Build Coastguard Worker 	unsigned int flock_release : 1;
82*9e564957SAndroid Build Coastguard Worker 
83*9e564957SAndroid Build Coastguard Worker 	/** Can be filled in by opendir. It signals the kernel to
84*9e564957SAndroid Build Coastguard Worker 	    enable caching of entries returned by readdir().  Has no
85*9e564957SAndroid Build Coastguard Worker 	    effect when set in other contexts (in particular it does
86*9e564957SAndroid Build Coastguard Worker 	    nothing when set by open()). */
87*9e564957SAndroid Build Coastguard Worker 	unsigned int cache_readdir : 1;
88*9e564957SAndroid Build Coastguard Worker 
89*9e564957SAndroid Build Coastguard Worker 	/** Can be filled in by open, to indicate that flush is not needed
90*9e564957SAndroid Build Coastguard Worker 	    on close. */
91*9e564957SAndroid Build Coastguard Worker 	unsigned int noflush : 1;
92*9e564957SAndroid Build Coastguard Worker 
93*9e564957SAndroid Build Coastguard Worker 	/** Padding.  Reserved for future use*/
94*9e564957SAndroid Build Coastguard Worker 	unsigned int padding : 23;
95*9e564957SAndroid Build Coastguard Worker 	unsigned int padding2 : 32;
96*9e564957SAndroid Build Coastguard Worker 
97*9e564957SAndroid Build Coastguard Worker 	/** File handle id.  May be filled in by filesystem in create,
98*9e564957SAndroid Build Coastguard Worker 	 * open, and opendir().  Available in most other file operations on the
99*9e564957SAndroid Build Coastguard Worker 	 * same file handle. */
100*9e564957SAndroid Build Coastguard Worker 	uint64_t fh;
101*9e564957SAndroid Build Coastguard Worker 
102*9e564957SAndroid Build Coastguard Worker 	/** Passthrough file handle id.  May be filled in by filesystem in
103*9e564957SAndroid Build Coastguard Worker 	 * create and open.  It is used to create a passthrough connection
104*9e564957SAndroid Build Coastguard Worker 	 * between FUSE file and lower file system file. */
105*9e564957SAndroid Build Coastguard Worker 	uint32_t passthrough_fh;
106*9e564957SAndroid Build Coastguard Worker 
107*9e564957SAndroid Build Coastguard Worker 	/** Lock owner id.  Available in locking operations and flush */
108*9e564957SAndroid Build Coastguard Worker 	uint64_t lock_owner;
109*9e564957SAndroid Build Coastguard Worker 
110*9e564957SAndroid Build Coastguard Worker 	/** Requested poll events.  Available in ->poll.  Only set on kernels
111*9e564957SAndroid Build Coastguard Worker 	    which support it.  If unsupported, this field is set to zero. */
112*9e564957SAndroid Build Coastguard Worker 	uint32_t poll_events;
113*9e564957SAndroid Build Coastguard Worker 
114*9e564957SAndroid Build Coastguard Worker 	/** Passthrough backing file id.  May be filled in by filesystem in
115*9e564957SAndroid Build Coastguard Worker 	 * create and open.  It is used to create a passthrough connection
116*9e564957SAndroid Build Coastguard Worker 	 * between FUSE file and backing file. */
117*9e564957SAndroid Build Coastguard Worker 	int32_t backing_id;
118*9e564957SAndroid Build Coastguard Worker };
119*9e564957SAndroid Build Coastguard Worker 
120*9e564957SAndroid Build Coastguard Worker 
121*9e564957SAndroid Build Coastguard Worker 
122*9e564957SAndroid Build Coastguard Worker /**
123*9e564957SAndroid Build Coastguard Worker  * Configuration parameters passed to fuse_session_loop_mt() and
124*9e564957SAndroid Build Coastguard Worker  * fuse_loop_mt().
125*9e564957SAndroid Build Coastguard Worker  * Deprecated and replaced by a newer private struct in FUSE API
126*9e564957SAndroid Build Coastguard Worker  * version 312 (FUSE_MAKE_VERSION(3, 12)
127*9e564957SAndroid Build Coastguard Worker  */
128*9e564957SAndroid Build Coastguard Worker #if FUSE_USE_VERSION < FUSE_MAKE_VERSION(3, 12)
129*9e564957SAndroid Build Coastguard Worker struct fuse_loop_config_v1; /* forward declarition */
130*9e564957SAndroid Build Coastguard Worker struct fuse_loop_config {
131*9e564957SAndroid Build Coastguard Worker #else
132*9e564957SAndroid Build Coastguard Worker struct fuse_loop_config_v1 {
133*9e564957SAndroid Build Coastguard Worker #endif
134*9e564957SAndroid Build Coastguard Worker 	/**
135*9e564957SAndroid Build Coastguard Worker 	 * whether to use separate device fds for each thread
136*9e564957SAndroid Build Coastguard Worker 	 * (may increase performance)
137*9e564957SAndroid Build Coastguard Worker 	 */
138*9e564957SAndroid Build Coastguard Worker 	int clone_fd;
139*9e564957SAndroid Build Coastguard Worker 
140*9e564957SAndroid Build Coastguard Worker 	/**
141*9e564957SAndroid Build Coastguard Worker 	 * The maximum number of available worker threads before they
142*9e564957SAndroid Build Coastguard Worker 	 * start to get deleted when they become idle. If not
143*9e564957SAndroid Build Coastguard Worker 	 * specified, the default is 10.
144*9e564957SAndroid Build Coastguard Worker 	 *
145*9e564957SAndroid Build Coastguard Worker 	 * Adjusting this has performance implications; a very small number
146*9e564957SAndroid Build Coastguard Worker 	 * of threads in the pool will cause a lot of thread creation and
147*9e564957SAndroid Build Coastguard Worker 	 * deletion overhead and performance may suffer. When set to 0, a new
148*9e564957SAndroid Build Coastguard Worker 	 * thread will be created to service every operation.
149*9e564957SAndroid Build Coastguard Worker 	 */
150*9e564957SAndroid Build Coastguard Worker 	unsigned int max_idle_threads;
151*9e564957SAndroid Build Coastguard Worker };
152*9e564957SAndroid Build Coastguard Worker 
153*9e564957SAndroid Build Coastguard Worker 
154*9e564957SAndroid Build Coastguard Worker /**************************************************************************
155*9e564957SAndroid Build Coastguard Worker  * Capability bits for 'fuse_conn_info.capable' and 'fuse_conn_info.want' *
156*9e564957SAndroid Build Coastguard Worker  **************************************************************************/
157*9e564957SAndroid Build Coastguard Worker 
158*9e564957SAndroid Build Coastguard Worker /**
159*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports asynchronous read requests.
160*9e564957SAndroid Build Coastguard Worker  *
161*9e564957SAndroid Build Coastguard Worker  * If this capability is not requested/available, the kernel will
162*9e564957SAndroid Build Coastguard Worker  * ensure that there is at most one pending read request per
163*9e564957SAndroid Build Coastguard Worker  * file-handle at any time, and will attempt to order read requests by
164*9e564957SAndroid Build Coastguard Worker  * increasing offset.
165*9e564957SAndroid Build Coastguard Worker  *
166*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel.
167*9e564957SAndroid Build Coastguard Worker  */
168*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_ASYNC_READ		(1 << 0)
169*9e564957SAndroid Build Coastguard Worker 
170*9e564957SAndroid Build Coastguard Worker /**
171*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports "remote" locking.
172*9e564957SAndroid Build Coastguard Worker  *
173*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel,
174*9e564957SAndroid Build Coastguard Worker  * and if getlk() and setlk() handlers are implemented.
175*9e564957SAndroid Build Coastguard Worker  */
176*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_POSIX_LOCKS		(1 << 1)
177*9e564957SAndroid Build Coastguard Worker 
178*9e564957SAndroid Build Coastguard Worker /**
179*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports the O_TRUNC open flag.  If
180*9e564957SAndroid Build Coastguard Worker  * disabled, and an application specifies O_TRUNC, fuse first calls
181*9e564957SAndroid Build Coastguard Worker  * truncate() and then open() with O_TRUNC filtered out.
182*9e564957SAndroid Build Coastguard Worker  *
183*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel.
184*9e564957SAndroid Build Coastguard Worker  */
185*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_ATOMIC_O_TRUNC		(1 << 3)
186*9e564957SAndroid Build Coastguard Worker 
187*9e564957SAndroid Build Coastguard Worker /**
188*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports lookups of "." and "..".
189*9e564957SAndroid Build Coastguard Worker  *
190*9e564957SAndroid Build Coastguard Worker  * When this flag is set, the filesystem must be prepared to receive requests
191*9e564957SAndroid Build Coastguard Worker  * for invalid inodes (i.e., for which a FORGET request was received or
192*9e564957SAndroid Build Coastguard Worker  * which have been used in a previous instance of the filesystem daemon) and
193*9e564957SAndroid Build Coastguard Worker  * must not reuse node-ids (even when setting generation numbers).
194*9e564957SAndroid Build Coastguard Worker  *
195*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
196*9e564957SAndroid Build Coastguard Worker  */
197*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_EXPORT_SUPPORT		(1 << 4)
198*9e564957SAndroid Build Coastguard Worker 
199*9e564957SAndroid Build Coastguard Worker /**
200*9e564957SAndroid Build Coastguard Worker  * Indicates that the kernel should not apply the umask to the
201*9e564957SAndroid Build Coastguard Worker  * file mode on create operations.
202*9e564957SAndroid Build Coastguard Worker  *
203*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
204*9e564957SAndroid Build Coastguard Worker  */
205*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_DONT_MASK		(1 << 6)
206*9e564957SAndroid Build Coastguard Worker 
207*9e564957SAndroid Build Coastguard Worker /**
208*9e564957SAndroid Build Coastguard Worker  * Indicates that libfuse should try to use splice() when writing to
209*9e564957SAndroid Build Coastguard Worker  * the fuse device. This may improve performance.
210*9e564957SAndroid Build Coastguard Worker  *
211*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
212*9e564957SAndroid Build Coastguard Worker  */
213*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_SPLICE_WRITE		(1 << 7)
214*9e564957SAndroid Build Coastguard Worker 
215*9e564957SAndroid Build Coastguard Worker /**
216*9e564957SAndroid Build Coastguard Worker  * Indicates that libfuse should try to move pages instead of copying when
217*9e564957SAndroid Build Coastguard Worker  * writing to / reading from the fuse device. This may improve performance.
218*9e564957SAndroid Build Coastguard Worker  *
219*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
220*9e564957SAndroid Build Coastguard Worker  */
221*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_SPLICE_MOVE		(1 << 8)
222*9e564957SAndroid Build Coastguard Worker 
223*9e564957SAndroid Build Coastguard Worker /**
224*9e564957SAndroid Build Coastguard Worker  * Indicates that libfuse should try to use splice() when reading from
225*9e564957SAndroid Build Coastguard Worker  * the fuse device. This may improve performance.
226*9e564957SAndroid Build Coastguard Worker  *
227*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel and
228*9e564957SAndroid Build Coastguard Worker  * if the filesystem implements a write_buf() handler.
229*9e564957SAndroid Build Coastguard Worker  */
230*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_SPLICE_READ		(1 << 9)
231*9e564957SAndroid Build Coastguard Worker 
232*9e564957SAndroid Build Coastguard Worker /**
233*9e564957SAndroid Build Coastguard Worker  * If set, the calls to flock(2) will be emulated using POSIX locks and must
234*9e564957SAndroid Build Coastguard Worker  * then be handled by the filesystem's setlock() handler.
235*9e564957SAndroid Build Coastguard Worker  *
236*9e564957SAndroid Build Coastguard Worker  * If not set, flock(2) calls will be handled by the FUSE kernel module
237*9e564957SAndroid Build Coastguard Worker  * internally (so any access that does not go through the kernel cannot be taken
238*9e564957SAndroid Build Coastguard Worker  * into account).
239*9e564957SAndroid Build Coastguard Worker  *
240*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel and
241*9e564957SAndroid Build Coastguard Worker  * if the filesystem implements a flock() handler.
242*9e564957SAndroid Build Coastguard Worker  */
243*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_FLOCK_LOCKS		(1 << 10)
244*9e564957SAndroid Build Coastguard Worker 
245*9e564957SAndroid Build Coastguard Worker /**
246*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports ioctl's on directories.
247*9e564957SAndroid Build Coastguard Worker  *
248*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel.
249*9e564957SAndroid Build Coastguard Worker  */
250*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_IOCTL_DIR		(1 << 11)
251*9e564957SAndroid Build Coastguard Worker 
252*9e564957SAndroid Build Coastguard Worker /**
253*9e564957SAndroid Build Coastguard Worker  * Traditionally, while a file is open the FUSE kernel module only
254*9e564957SAndroid Build Coastguard Worker  * asks the filesystem for an update of the file's attributes when a
255*9e564957SAndroid Build Coastguard Worker  * client attempts to read beyond EOF. This is unsuitable for
256*9e564957SAndroid Build Coastguard Worker  * e.g. network filesystems, where the file contents may change
257*9e564957SAndroid Build Coastguard Worker  * without the kernel knowing about it.
258*9e564957SAndroid Build Coastguard Worker  *
259*9e564957SAndroid Build Coastguard Worker  * If this flag is set, FUSE will check the validity of the attributes
260*9e564957SAndroid Build Coastguard Worker  * on every read. If the attributes are no longer valid (i.e., if the
261*9e564957SAndroid Build Coastguard Worker  * *attr_timeout* passed to fuse_reply_attr() or set in `struct
262*9e564957SAndroid Build Coastguard Worker  * fuse_entry_param` has passed), it will first issue a `getattr`
263*9e564957SAndroid Build Coastguard Worker  * request. If the new mtime differs from the previous value, any
264*9e564957SAndroid Build Coastguard Worker  * cached file *contents* will be invalidated as well.
265*9e564957SAndroid Build Coastguard Worker  *
266*9e564957SAndroid Build Coastguard Worker  * This flag should always be set when available. If all file changes
267*9e564957SAndroid Build Coastguard Worker  * go through the kernel, *attr_timeout* should be set to a very large
268*9e564957SAndroid Build Coastguard Worker  * number to avoid unnecessary getattr() calls.
269*9e564957SAndroid Build Coastguard Worker  *
270*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel.
271*9e564957SAndroid Build Coastguard Worker  */
272*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_AUTO_INVAL_DATA	(1 << 12)
273*9e564957SAndroid Build Coastguard Worker 
274*9e564957SAndroid Build Coastguard Worker /**
275*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports readdirplus.
276*9e564957SAndroid Build Coastguard Worker  *
277*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel and if the
278*9e564957SAndroid Build Coastguard Worker  * filesystem implements a readdirplus() handler.
279*9e564957SAndroid Build Coastguard Worker  */
280*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_READDIRPLUS		(1 << 13)
281*9e564957SAndroid Build Coastguard Worker 
282*9e564957SAndroid Build Coastguard Worker /**
283*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports adaptive readdirplus.
284*9e564957SAndroid Build Coastguard Worker  *
285*9e564957SAndroid Build Coastguard Worker  * If FUSE_CAP_READDIRPLUS is not set, this flag has no effect.
286*9e564957SAndroid Build Coastguard Worker  *
287*9e564957SAndroid Build Coastguard Worker  * If FUSE_CAP_READDIRPLUS is set and this flag is not set, the kernel
288*9e564957SAndroid Build Coastguard Worker  * will always issue readdirplus() requests to retrieve directory
289*9e564957SAndroid Build Coastguard Worker  * contents.
290*9e564957SAndroid Build Coastguard Worker  *
291*9e564957SAndroid Build Coastguard Worker  * If FUSE_CAP_READDIRPLUS is set and this flag is set, the kernel
292*9e564957SAndroid Build Coastguard Worker  * will issue both readdir() and readdirplus() requests, depending on
293*9e564957SAndroid Build Coastguard Worker  * how much information is expected to be required.
294*9e564957SAndroid Build Coastguard Worker  *
295*9e564957SAndroid Build Coastguard Worker  * As of Linux 4.20, the algorithm is as follows: when userspace
296*9e564957SAndroid Build Coastguard Worker  * starts to read directory entries, issue a READDIRPLUS request to
297*9e564957SAndroid Build Coastguard Worker  * the filesystem. If any entry attributes have been looked up by the
298*9e564957SAndroid Build Coastguard Worker  * time userspace requests the next batch of entries continue with
299*9e564957SAndroid Build Coastguard Worker  * READDIRPLUS, otherwise switch to plain READDIR.  This will reasult
300*9e564957SAndroid Build Coastguard Worker  * in eg plain "ls" triggering READDIRPLUS first then READDIR after
301*9e564957SAndroid Build Coastguard Worker  * that because it doesn't do lookups.  "ls -l" should result in all
302*9e564957SAndroid Build Coastguard Worker  * READDIRPLUS, except if dentries are already cached.
303*9e564957SAndroid Build Coastguard Worker  *
304*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel and
305*9e564957SAndroid Build Coastguard Worker  * if the filesystem implements both a readdirplus() and a readdir()
306*9e564957SAndroid Build Coastguard Worker  * handler.
307*9e564957SAndroid Build Coastguard Worker  */
308*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_READDIRPLUS_AUTO	(1 << 14)
309*9e564957SAndroid Build Coastguard Worker 
310*9e564957SAndroid Build Coastguard Worker /**
311*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem supports asynchronous direct I/O submission.
312*9e564957SAndroid Build Coastguard Worker  *
313*9e564957SAndroid Build Coastguard Worker  * If this capability is not requested/available, the kernel will ensure that
314*9e564957SAndroid Build Coastguard Worker  * there is at most one pending read and one pending write request per direct
315*9e564957SAndroid Build Coastguard Worker  * I/O file-handle at any time.
316*9e564957SAndroid Build Coastguard Worker  *
317*9e564957SAndroid Build Coastguard Worker  * This feature is enabled by default when supported by the kernel.
318*9e564957SAndroid Build Coastguard Worker  */
319*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_ASYNC_DIO		(1 << 15)
320*9e564957SAndroid Build Coastguard Worker 
321*9e564957SAndroid Build Coastguard Worker /**
322*9e564957SAndroid Build Coastguard Worker  * Indicates that writeback caching should be enabled. This means that
323*9e564957SAndroid Build Coastguard Worker  * individual write request may be buffered and merged in the kernel
324*9e564957SAndroid Build Coastguard Worker  * before they are send to the filesystem.
325*9e564957SAndroid Build Coastguard Worker  *
326*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
327*9e564957SAndroid Build Coastguard Worker  */
328*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_WRITEBACK_CACHE	(1 << 16)
329*9e564957SAndroid Build Coastguard Worker 
330*9e564957SAndroid Build Coastguard Worker /**
331*9e564957SAndroid Build Coastguard Worker  * Indicates support for zero-message opens. If this flag is set in
332*9e564957SAndroid Build Coastguard Worker  * the `capable` field of the `fuse_conn_info` structure, then the
333*9e564957SAndroid Build Coastguard Worker  * filesystem may return `ENOSYS` from the open() handler to indicate
334*9e564957SAndroid Build Coastguard Worker  * success. Further attempts to open files will be handled in the
335*9e564957SAndroid Build Coastguard Worker  * kernel. (If this flag is not set, returning ENOSYS will be treated
336*9e564957SAndroid Build Coastguard Worker  * as an error and signaled to the caller).
337*9e564957SAndroid Build Coastguard Worker  *
338*9e564957SAndroid Build Coastguard Worker  * Setting this flag in the `want` field enables this behavior automatically
339*9e564957SAndroid Build Coastguard Worker  * within libfuse for low level API users. If non-low level users wish to have
340*9e564957SAndroid Build Coastguard Worker  * this behavior you must return `ENOSYS` from the open() handler on supporting
341*9e564957SAndroid Build Coastguard Worker  * kernels.
342*9e564957SAndroid Build Coastguard Worker  */
343*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_NO_OPEN_SUPPORT	(1 << 17)
344*9e564957SAndroid Build Coastguard Worker 
345*9e564957SAndroid Build Coastguard Worker /**
346*9e564957SAndroid Build Coastguard Worker  * Indicates support for parallel directory operations. If this flag
347*9e564957SAndroid Build Coastguard Worker  * is unset, the FUSE kernel module will ensure that lookup() and
348*9e564957SAndroid Build Coastguard Worker  * readdir() requests are never issued concurrently for the same
349*9e564957SAndroid Build Coastguard Worker  * directory.
350*9e564957SAndroid Build Coastguard Worker  */
351*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_PARALLEL_DIROPS        (1 << 18)
352*9e564957SAndroid Build Coastguard Worker 
353*9e564957SAndroid Build Coastguard Worker /**
354*9e564957SAndroid Build Coastguard Worker  * Indicates support for POSIX ACLs.
355*9e564957SAndroid Build Coastguard Worker  *
356*9e564957SAndroid Build Coastguard Worker  * If this feature is enabled, the kernel will cache and have
357*9e564957SAndroid Build Coastguard Worker  * responsibility for enforcing ACLs. ACL will be stored as xattrs and
358*9e564957SAndroid Build Coastguard Worker  * passed to userspace, which is responsible for updating the ACLs in
359*9e564957SAndroid Build Coastguard Worker  * the filesystem, keeping the file mode in sync with the ACL, and
360*9e564957SAndroid Build Coastguard Worker  * ensuring inheritance of default ACLs when new filesystem nodes are
361*9e564957SAndroid Build Coastguard Worker  * created. Note that this requires that the file system is able to
362*9e564957SAndroid Build Coastguard Worker  * parse and interpret the xattr representation of ACLs.
363*9e564957SAndroid Build Coastguard Worker  *
364*9e564957SAndroid Build Coastguard Worker  * Enabling this feature implicitly turns on the
365*9e564957SAndroid Build Coastguard Worker  * ``default_permissions`` mount option (even if it was not passed to
366*9e564957SAndroid Build Coastguard Worker  * mount(2)).
367*9e564957SAndroid Build Coastguard Worker  *
368*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
369*9e564957SAndroid Build Coastguard Worker  */
370*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_POSIX_ACL              (1 << 19)
371*9e564957SAndroid Build Coastguard Worker 
372*9e564957SAndroid Build Coastguard Worker /**
373*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem is responsible for unsetting
374*9e564957SAndroid Build Coastguard Worker  * setuid and setgid bits when a file is written, truncated, or
375*9e564957SAndroid Build Coastguard Worker  * its owner is changed.
376*9e564957SAndroid Build Coastguard Worker  *
377*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
378*9e564957SAndroid Build Coastguard Worker  */
379*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_HANDLE_KILLPRIV         (1 << 20)
380*9e564957SAndroid Build Coastguard Worker 
381*9e564957SAndroid Build Coastguard Worker /**
382*9e564957SAndroid Build Coastguard Worker  * Indicates that the filesystem is responsible for unsetting
383*9e564957SAndroid Build Coastguard Worker  * setuid and setgid bit and additionally cap (stored as xattr) when a
384*9e564957SAndroid Build Coastguard Worker  * file is written, truncated, or its owner is changed.
385*9e564957SAndroid Build Coastguard Worker  * Upon write/truncate suid/sgid is only killed if caller
386*9e564957SAndroid Build Coastguard Worker  * does not have CAP_FSETID. Additionally upon
387*9e564957SAndroid Build Coastguard Worker  * write/truncate sgid is killed only if file has group
388*9e564957SAndroid Build Coastguard Worker  * execute permission. (Same as Linux VFS behavior).
389*9e564957SAndroid Build Coastguard Worker  * KILLPRIV_V2 requires handling of
390*9e564957SAndroid Build Coastguard Worker  *   - FUSE_OPEN_KILL_SUIDGID (set in struct fuse_create_in::open_flags)
391*9e564957SAndroid Build Coastguard Worker  *   - FATTR_KILL_SUIDGID (set in struct fuse_setattr_in::valid)
392*9e564957SAndroid Build Coastguard Worker  *   - FUSE_WRITE_KILL_SUIDGID (set in struct fuse_write_in::write_flags)
393*9e564957SAndroid Build Coastguard Worker  *
394*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
395*9e564957SAndroid Build Coastguard Worker  */
396*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_HANDLE_KILLPRIV_V2         (1 << 21)
397*9e564957SAndroid Build Coastguard Worker 
398*9e564957SAndroid Build Coastguard Worker /**
399*9e564957SAndroid Build Coastguard Worker  * Indicates that the kernel supports caching symlinks in its page cache.
400*9e564957SAndroid Build Coastguard Worker  *
401*9e564957SAndroid Build Coastguard Worker  * When this feature is enabled, symlink targets are saved in the page cache.
402*9e564957SAndroid Build Coastguard Worker  * You can invalidate a cached link by calling:
403*9e564957SAndroid Build Coastguard Worker  * `fuse_lowlevel_notify_inval_inode(se, ino, 0, 0);`
404*9e564957SAndroid Build Coastguard Worker  *
405*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
406*9e564957SAndroid Build Coastguard Worker  * If the kernel supports it (>= 4.20), you can enable this feature by
407*9e564957SAndroid Build Coastguard Worker  * setting this flag in the `want` field of the `fuse_conn_info` structure.
408*9e564957SAndroid Build Coastguard Worker  */
409*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_CACHE_SYMLINKS        (1 << 23)
410*9e564957SAndroid Build Coastguard Worker 
411*9e564957SAndroid Build Coastguard Worker /**
412*9e564957SAndroid Build Coastguard Worker  * Indicates support for zero-message opendirs. If this flag is set in
413*9e564957SAndroid Build Coastguard Worker  * the `capable` field of the `fuse_conn_info` structure, then the filesystem
414*9e564957SAndroid Build Coastguard Worker  * may return `ENOSYS` from the opendir() handler to indicate success. Further
415*9e564957SAndroid Build Coastguard Worker  * opendir and releasedir messages will be handled in the kernel. (If this
416*9e564957SAndroid Build Coastguard Worker  * flag is not set, returning ENOSYS will be treated as an error and signalled
417*9e564957SAndroid Build Coastguard Worker  * to the caller.)
418*9e564957SAndroid Build Coastguard Worker  *
419*9e564957SAndroid Build Coastguard Worker  * Setting this flag in the `want` field enables this behavior automatically
420*9e564957SAndroid Build Coastguard Worker  * within libfuse for low level API users.  If non-low level users with to have
421*9e564957SAndroid Build Coastguard Worker  * this behavior you must return `ENOSYS` from the opendir() handler on
422*9e564957SAndroid Build Coastguard Worker  * supporting kernels.
423*9e564957SAndroid Build Coastguard Worker  */
424*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_NO_OPENDIR_SUPPORT    (1 << 24)
425*9e564957SAndroid Build Coastguard Worker 
426*9e564957SAndroid Build Coastguard Worker /**
427*9e564957SAndroid Build Coastguard Worker  * Indicates support for invalidating cached pages only on explicit request.
428*9e564957SAndroid Build Coastguard Worker  *
429*9e564957SAndroid Build Coastguard Worker  * If this flag is set in the `capable` field of the `fuse_conn_info` structure,
430*9e564957SAndroid Build Coastguard Worker  * then the FUSE kernel module supports invalidating cached pages only on
431*9e564957SAndroid Build Coastguard Worker  * explicit request by the filesystem through fuse_lowlevel_notify_inval_inode()
432*9e564957SAndroid Build Coastguard Worker  * or fuse_invalidate_path().
433*9e564957SAndroid Build Coastguard Worker  *
434*9e564957SAndroid Build Coastguard Worker  * By setting this flag in the `want` field of the `fuse_conn_info` structure,
435*9e564957SAndroid Build Coastguard Worker  * the filesystem is responsible for invalidating cached pages through explicit
436*9e564957SAndroid Build Coastguard Worker  * requests to the kernel.
437*9e564957SAndroid Build Coastguard Worker  *
438*9e564957SAndroid Build Coastguard Worker  * Note that setting this flag does not prevent the cached pages from being
439*9e564957SAndroid Build Coastguard Worker  * flushed by OS itself and/or through user actions.
440*9e564957SAndroid Build Coastguard Worker  *
441*9e564957SAndroid Build Coastguard Worker  * Note that if both FUSE_CAP_EXPLICIT_INVAL_DATA and FUSE_CAP_AUTO_INVAL_DATA
442*9e564957SAndroid Build Coastguard Worker  * are set in the `capable` field of the `fuse_conn_info` structure then
443*9e564957SAndroid Build Coastguard Worker  * FUSE_CAP_AUTO_INVAL_DATA takes precedence.
444*9e564957SAndroid Build Coastguard Worker  *
445*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
446*9e564957SAndroid Build Coastguard Worker  */
447*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_EXPLICIT_INVAL_DATA    (1 << 25)
448*9e564957SAndroid Build Coastguard Worker 
449*9e564957SAndroid Build Coastguard Worker /**
450*9e564957SAndroid Build Coastguard Worker  * Indicates support that dentries can be expired.
451*9e564957SAndroid Build Coastguard Worker  *
452*9e564957SAndroid Build Coastguard Worker  * Expiring dentries, instead of invalidating them, makes a difference for
453*9e564957SAndroid Build Coastguard Worker  * overmounted dentries, where plain invalidation would detach all submounts
454*9e564957SAndroid Build Coastguard Worker  * before dropping the dentry from the cache. If only expiry is set on the
455*9e564957SAndroid Build Coastguard Worker  * dentry, then any overmounts are left alone and until ->d_revalidate()
456*9e564957SAndroid Build Coastguard Worker  * is called.
457*9e564957SAndroid Build Coastguard Worker  *
458*9e564957SAndroid Build Coastguard Worker  * Note: ->d_revalidate() is not called for the case of following a submount,
459*9e564957SAndroid Build Coastguard Worker  * so invalidation will only be triggered for the non-overmounted case.
460*9e564957SAndroid Build Coastguard Worker  * The dentry could also be mounted in a different mount instance, in which case
461*9e564957SAndroid Build Coastguard Worker  * any submounts will still be detached.
462*9e564957SAndroid Build Coastguard Worker */
463*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_EXPIRE_ONLY      (1 << 26)
464*9e564957SAndroid Build Coastguard Worker 
465*9e564957SAndroid Build Coastguard Worker /**
466*9e564957SAndroid Build Coastguard Worker  * Indicates that an extended 'struct fuse_setxattr' is used by the kernel
467*9e564957SAndroid Build Coastguard Worker  * side - extra_flags are passed, which are used (as of now by acl) processing.
468*9e564957SAndroid Build Coastguard Worker  * For example FUSE_SETXATTR_ACL_KILL_SGID might be set.
469*9e564957SAndroid Build Coastguard Worker  */
470*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_SETXATTR_EXT     (1 << 27)
471*9e564957SAndroid Build Coastguard Worker 
472*9e564957SAndroid Build Coastguard Worker /**
473*9e564957SAndroid Build Coastguard Worker  * Files opened with FUSE_DIRECT_IO do not support MAP_SHARED mmap. This restriction
474*9e564957SAndroid Build Coastguard Worker  * is relaxed through FUSE_CAP_DIRECT_IO_RELAX (kernel flag: FUSE_DIRECT_IO_RELAX).
475*9e564957SAndroid Build Coastguard Worker  * MAP_SHARED is disabled by default for FUSE_DIRECT_IO, as this flag can be used to
476*9e564957SAndroid Build Coastguard Worker  * ensure coherency between mount points (or network clients) and with kernel page
477*9e564957SAndroid Build Coastguard Worker  * cache as enforced by mmap that cannot be guaranteed anymore.
478*9e564957SAndroid Build Coastguard Worker  */
479*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_DIRECT_IO_ALLOW_MMAP  (1 << 28)
480*9e564957SAndroid Build Coastguard Worker 
481*9e564957SAndroid Build Coastguard Worker /**
482*9e564957SAndroid Build Coastguard Worker  * Indicates support for passthrough mode access for read/write operations.
483*9e564957SAndroid Build Coastguard Worker  *
484*9e564957SAndroid Build Coastguard Worker  * If this flag is set in the `capable` field of the `fuse_conn_info`
485*9e564957SAndroid Build Coastguard Worker  * structure, then the FUSE kernel module supports redirecting read/write
486*9e564957SAndroid Build Coastguard Worker  * operations to the backing file instead of letting them to be handled
487*9e564957SAndroid Build Coastguard Worker  * by the FUSE daemon.
488*9e564957SAndroid Build Coastguard Worker  *
489*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
490*9e564957SAndroid Build Coastguard Worker  */
491*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_PASSTHROUGH_UPSTREAM      (1 << 29)
492*9e564957SAndroid Build Coastguard Worker 
493*9e564957SAndroid Build Coastguard Worker /**
494*9e564957SAndroid Build Coastguard Worker  * Indicates support for passthrough mode access for read/write operations.
495*9e564957SAndroid Build Coastguard Worker  *
496*9e564957SAndroid Build Coastguard Worker  * If this flag is set in the `capable` field of the `fuse_conn_info`
497*9e564957SAndroid Build Coastguard Worker  * structure, then the FUSE kernel module supports redirecting read/write
498*9e564957SAndroid Build Coastguard Worker  * operations to the lower file system instead of letting them to be handled
499*9e564957SAndroid Build Coastguard Worker  * by the FUSE daemon.
500*9e564957SAndroid Build Coastguard Worker  *
501*9e564957SAndroid Build Coastguard Worker  * This feature is disabled by default.
502*9e564957SAndroid Build Coastguard Worker  */
503*9e564957SAndroid Build Coastguard Worker #define FUSE_CAP_PASSTHROUGH            (1LL << 63)
504*9e564957SAndroid Build Coastguard Worker 
505*9e564957SAndroid Build Coastguard Worker /**
506*9e564957SAndroid Build Coastguard Worker  * Ioctl flags
507*9e564957SAndroid Build Coastguard Worker  *
508*9e564957SAndroid Build Coastguard Worker  * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
509*9e564957SAndroid Build Coastguard Worker  * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
510*9e564957SAndroid Build Coastguard Worker  * FUSE_IOCTL_RETRY: retry with new iovecs
511*9e564957SAndroid Build Coastguard Worker  * FUSE_IOCTL_DIR: is a directory
512*9e564957SAndroid Build Coastguard Worker  *
513*9e564957SAndroid Build Coastguard Worker  * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
514*9e564957SAndroid Build Coastguard Worker  */
515*9e564957SAndroid Build Coastguard Worker #define FUSE_IOCTL_COMPAT	(1 << 0)
516*9e564957SAndroid Build Coastguard Worker #define FUSE_IOCTL_UNRESTRICTED	(1 << 1)
517*9e564957SAndroid Build Coastguard Worker #define FUSE_IOCTL_RETRY	(1 << 2)
518*9e564957SAndroid Build Coastguard Worker #define FUSE_IOCTL_DIR		(1 << 4)
519*9e564957SAndroid Build Coastguard Worker 
520*9e564957SAndroid Build Coastguard Worker #define FUSE_IOCTL_MAX_IOV	256
521*9e564957SAndroid Build Coastguard Worker 
522*9e564957SAndroid Build Coastguard Worker /**
523*9e564957SAndroid Build Coastguard Worker  * Connection information, passed to the ->init() method
524*9e564957SAndroid Build Coastguard Worker  *
525*9e564957SAndroid Build Coastguard Worker  * Some of the elements are read-write, these can be changed to
526*9e564957SAndroid Build Coastguard Worker  * indicate the value requested by the filesystem.  The requested
527*9e564957SAndroid Build Coastguard Worker  * value must usually be smaller than the indicated value.
528*9e564957SAndroid Build Coastguard Worker  */
529*9e564957SAndroid Build Coastguard Worker struct fuse_conn_info {
530*9e564957SAndroid Build Coastguard Worker 	/**
531*9e564957SAndroid Build Coastguard Worker 	 * Major version of the protocol (read-only)
532*9e564957SAndroid Build Coastguard Worker 	 */
533*9e564957SAndroid Build Coastguard Worker 	unsigned proto_major;
534*9e564957SAndroid Build Coastguard Worker 
535*9e564957SAndroid Build Coastguard Worker 	/**
536*9e564957SAndroid Build Coastguard Worker 	 * Minor version of the protocol (read-only)
537*9e564957SAndroid Build Coastguard Worker 	 */
538*9e564957SAndroid Build Coastguard Worker 	unsigned proto_minor;
539*9e564957SAndroid Build Coastguard Worker 
540*9e564957SAndroid Build Coastguard Worker 	/**
541*9e564957SAndroid Build Coastguard Worker 	 * Maximum size of the write buffer
542*9e564957SAndroid Build Coastguard Worker 	 */
543*9e564957SAndroid Build Coastguard Worker 	unsigned max_write;
544*9e564957SAndroid Build Coastguard Worker 
545*9e564957SAndroid Build Coastguard Worker 	/**
546*9e564957SAndroid Build Coastguard Worker 	 * Maximum size of read requests. A value of zero indicates no
547*9e564957SAndroid Build Coastguard Worker 	 * limit. However, even if the filesystem does not specify a
548*9e564957SAndroid Build Coastguard Worker 	 * limit, the maximum size of read requests will still be
549*9e564957SAndroid Build Coastguard Worker 	 * limited by the kernel.
550*9e564957SAndroid Build Coastguard Worker 	 *
551*9e564957SAndroid Build Coastguard Worker 	 * NOTE: For the time being, the maximum size of read requests
552*9e564957SAndroid Build Coastguard Worker 	 * must be set both here *and* passed to fuse_session_new()
553*9e564957SAndroid Build Coastguard Worker 	 * using the ``-o max_read=<n>`` mount option. At some point
554*9e564957SAndroid Build Coastguard Worker 	 * in the future, specifying the mount option will no longer
555*9e564957SAndroid Build Coastguard Worker 	 * be necessary.
556*9e564957SAndroid Build Coastguard Worker 	 */
557*9e564957SAndroid Build Coastguard Worker 	unsigned max_read;
558*9e564957SAndroid Build Coastguard Worker 
559*9e564957SAndroid Build Coastguard Worker 	/**
560*9e564957SAndroid Build Coastguard Worker 	 * Maximum readahead
561*9e564957SAndroid Build Coastguard Worker 	 */
562*9e564957SAndroid Build Coastguard Worker 	unsigned max_readahead;
563*9e564957SAndroid Build Coastguard Worker 
564*9e564957SAndroid Build Coastguard Worker 	/**
565*9e564957SAndroid Build Coastguard Worker 	 * Capability flags that the kernel supports (read-only)
566*9e564957SAndroid Build Coastguard Worker 	 */
567*9e564957SAndroid Build Coastguard Worker 	uint64_t capable;
568*9e564957SAndroid Build Coastguard Worker 
569*9e564957SAndroid Build Coastguard Worker 	/**
570*9e564957SAndroid Build Coastguard Worker 	 * Capability flags that the filesystem wants to enable.
571*9e564957SAndroid Build Coastguard Worker 	 *
572*9e564957SAndroid Build Coastguard Worker 	 * libfuse attempts to initialize this field with
573*9e564957SAndroid Build Coastguard Worker 	 * reasonable default values before calling the init() handler.
574*9e564957SAndroid Build Coastguard Worker 	 */
575*9e564957SAndroid Build Coastguard Worker 	uint64_t want;
576*9e564957SAndroid Build Coastguard Worker 
577*9e564957SAndroid Build Coastguard Worker 	/**
578*9e564957SAndroid Build Coastguard Worker 	 * Maximum number of pending "background" requests. A
579*9e564957SAndroid Build Coastguard Worker 	 * background request is any type of request for which the
580*9e564957SAndroid Build Coastguard Worker 	 * total number is not limited by other means. As of kernel
581*9e564957SAndroid Build Coastguard Worker 	 * 4.8, only two types of requests fall into this category:
582*9e564957SAndroid Build Coastguard Worker 	 *
583*9e564957SAndroid Build Coastguard Worker 	 *   1. Read-ahead requests
584*9e564957SAndroid Build Coastguard Worker 	 *   2. Asynchronous direct I/O requests
585*9e564957SAndroid Build Coastguard Worker 	 *
586*9e564957SAndroid Build Coastguard Worker 	 * Read-ahead requests are generated (if max_readahead is
587*9e564957SAndroid Build Coastguard Worker 	 * non-zero) by the kernel to preemptively fill its caches
588*9e564957SAndroid Build Coastguard Worker 	 * when it anticipates that userspace will soon read more
589*9e564957SAndroid Build Coastguard Worker 	 * data.
590*9e564957SAndroid Build Coastguard Worker 	 *
591*9e564957SAndroid Build Coastguard Worker 	 * Asynchronous direct I/O requests are generated if
592*9e564957SAndroid Build Coastguard Worker 	 * FUSE_CAP_ASYNC_DIO is enabled and userspace submits a large
593*9e564957SAndroid Build Coastguard Worker 	 * direct I/O request. In this case the kernel will internally
594*9e564957SAndroid Build Coastguard Worker 	 * split it up into multiple smaller requests and submit them
595*9e564957SAndroid Build Coastguard Worker 	 * to the filesystem concurrently.
596*9e564957SAndroid Build Coastguard Worker 	 *
597*9e564957SAndroid Build Coastguard Worker 	 * Note that the following requests are *not* background
598*9e564957SAndroid Build Coastguard Worker 	 * requests: writeback requests (limited by the kernel's
599*9e564957SAndroid Build Coastguard Worker 	 * flusher algorithm), regular (i.e., synchronous and
600*9e564957SAndroid Build Coastguard Worker 	 * buffered) userspace read/write requests (limited to one per
601*9e564957SAndroid Build Coastguard Worker 	 * thread), asynchronous read requests (Linux's io_submit(2)
602*9e564957SAndroid Build Coastguard Worker 	 * call actually blocks, so these are also limited to one per
603*9e564957SAndroid Build Coastguard Worker 	 * thread).
604*9e564957SAndroid Build Coastguard Worker 	 */
605*9e564957SAndroid Build Coastguard Worker 	unsigned max_background;
606*9e564957SAndroid Build Coastguard Worker 
607*9e564957SAndroid Build Coastguard Worker 	/**
608*9e564957SAndroid Build Coastguard Worker 	 * Kernel congestion threshold parameter. If the number of pending
609*9e564957SAndroid Build Coastguard Worker 	 * background requests exceeds this number, the FUSE kernel module will
610*9e564957SAndroid Build Coastguard Worker 	 * mark the filesystem as "congested". This instructs the kernel to
611*9e564957SAndroid Build Coastguard Worker 	 * expect that queued requests will take some time to complete, and to
612*9e564957SAndroid Build Coastguard Worker 	 * adjust its algorithms accordingly (e.g. by putting a waiting thread
613*9e564957SAndroid Build Coastguard Worker 	 * to sleep instead of using a busy-loop).
614*9e564957SAndroid Build Coastguard Worker 	 */
615*9e564957SAndroid Build Coastguard Worker 	unsigned congestion_threshold;
616*9e564957SAndroid Build Coastguard Worker 
617*9e564957SAndroid Build Coastguard Worker 	/**
618*9e564957SAndroid Build Coastguard Worker 	 * When FUSE_CAP_WRITEBACK_CACHE is enabled, the kernel is responsible
619*9e564957SAndroid Build Coastguard Worker 	 * for updating mtime and ctime when write requests are received. The
620*9e564957SAndroid Build Coastguard Worker 	 * updated values are passed to the filesystem with setattr() requests.
621*9e564957SAndroid Build Coastguard Worker 	 * However, if the filesystem does not support the full resolution of
622*9e564957SAndroid Build Coastguard Worker 	 * the kernel timestamps (nanoseconds), the mtime and ctime values used
623*9e564957SAndroid Build Coastguard Worker 	 * by kernel and filesystem will differ (and result in an apparent
624*9e564957SAndroid Build Coastguard Worker 	 * change of times after a cache flush).
625*9e564957SAndroid Build Coastguard Worker 	 *
626*9e564957SAndroid Build Coastguard Worker 	 * To prevent this problem, this variable can be used to inform the
627*9e564957SAndroid Build Coastguard Worker 	 * kernel about the timestamp granularity supported by the file-system.
628*9e564957SAndroid Build Coastguard Worker 	 * The value should be power of 10.  The default is 1, i.e. full
629*9e564957SAndroid Build Coastguard Worker 	 * nano-second resolution. Filesystems supporting only second resolution
630*9e564957SAndroid Build Coastguard Worker 	 * should set this to 1000000000.
631*9e564957SAndroid Build Coastguard Worker 	 */
632*9e564957SAndroid Build Coastguard Worker 	unsigned time_gran;
633*9e564957SAndroid Build Coastguard Worker 
634*9e564957SAndroid Build Coastguard Worker 	/**
635*9e564957SAndroid Build Coastguard Worker 	 * When FUSE_CAP_PASSTHROUGH is enabled, this is the maximum allowed
636*9e564957SAndroid Build Coastguard Worker 	 * stacking depth of the backing files.  In current kernel, the maximum
637*9e564957SAndroid Build Coastguard Worker 	 * allowed stack depth if FILESYSTEM_MAX_STACK_DEPTH (2), which includes
638*9e564957SAndroid Build Coastguard Worker 	 * the FUSE passthrough layer, so the maximum stacking depth for backing
639*9e564957SAndroid Build Coastguard Worker 	 * files is 1.
640*9e564957SAndroid Build Coastguard Worker 	 *
641*9e564957SAndroid Build Coastguard Worker 	 * The default is FUSE_BACKING_STACKED_UNDER (0), meaning that the
642*9e564957SAndroid Build Coastguard Worker 	 * backing files cannot be on a stacked filesystem, but another stacked
643*9e564957SAndroid Build Coastguard Worker 	 * filesystem can be stacked over this FUSE passthrough filesystem.
644*9e564957SAndroid Build Coastguard Worker 	 *
645*9e564957SAndroid Build Coastguard Worker 	 * Set this to FUSE_BACKING_STACKED_OVER (1) if backing files may be on
646*9e564957SAndroid Build Coastguard Worker 	 * a stacked filesystem, such as overlayfs or another FUSE passthrough.
647*9e564957SAndroid Build Coastguard Worker 	 * In this configuration, another stacked filesystem cannot be stacked
648*9e564957SAndroid Build Coastguard Worker 	 * over this FUSE passthrough filesystem.
649*9e564957SAndroid Build Coastguard Worker 	 */
650*9e564957SAndroid Build Coastguard Worker #define FUSE_BACKING_STACKED_UNDER	(0)
651*9e564957SAndroid Build Coastguard Worker #define FUSE_BACKING_STACKED_OVER	(1)
652*9e564957SAndroid Build Coastguard Worker 	unsigned max_backing_stack_depth;
653*9e564957SAndroid Build Coastguard Worker 
654*9e564957SAndroid Build Coastguard Worker 	/**
655*9e564957SAndroid Build Coastguard Worker 	 * For future use.
656*9e564957SAndroid Build Coastguard Worker 	 */
657*9e564957SAndroid Build Coastguard Worker 	unsigned reserved[21];
658*9e564957SAndroid Build Coastguard Worker };
659*9e564957SAndroid Build Coastguard Worker 
660*9e564957SAndroid Build Coastguard Worker struct fuse_session;
661*9e564957SAndroid Build Coastguard Worker struct fuse_pollhandle;
662*9e564957SAndroid Build Coastguard Worker struct fuse_conn_info_opts;
663*9e564957SAndroid Build Coastguard Worker 
664*9e564957SAndroid Build Coastguard Worker /**
665*9e564957SAndroid Build Coastguard Worker  * This function parses several command-line options that can be used
666*9e564957SAndroid Build Coastguard Worker  * to override elements of struct fuse_conn_info. The pointer returned
667*9e564957SAndroid Build Coastguard Worker  * by this function should be passed to the
668*9e564957SAndroid Build Coastguard Worker  * fuse_apply_conn_info_opts() method by the file system's init()
669*9e564957SAndroid Build Coastguard Worker  * handler.
670*9e564957SAndroid Build Coastguard Worker  *
671*9e564957SAndroid Build Coastguard Worker  * Before using this function, think twice if you really want these
672*9e564957SAndroid Build Coastguard Worker  * parameters to be adjustable from the command line. In most cases,
673*9e564957SAndroid Build Coastguard Worker  * they should be determined by the file system internally.
674*9e564957SAndroid Build Coastguard Worker  *
675*9e564957SAndroid Build Coastguard Worker  * The following options are recognized:
676*9e564957SAndroid Build Coastguard Worker  *
677*9e564957SAndroid Build Coastguard Worker  *   -o max_write=N         sets conn->max_write
678*9e564957SAndroid Build Coastguard Worker  *   -o max_readahead=N     sets conn->max_readahead
679*9e564957SAndroid Build Coastguard Worker  *   -o max_background=N    sets conn->max_background
680*9e564957SAndroid Build Coastguard Worker  *   -o congestion_threshold=N  sets conn->congestion_threshold
681*9e564957SAndroid Build Coastguard Worker  *   -o async_read          sets FUSE_CAP_ASYNC_READ in conn->want
682*9e564957SAndroid Build Coastguard Worker  *   -o sync_read           unsets FUSE_CAP_ASYNC_READ in conn->want
683*9e564957SAndroid Build Coastguard Worker  *   -o atomic_o_trunc      sets FUSE_CAP_ATOMIC_O_TRUNC in conn->want
684*9e564957SAndroid Build Coastguard Worker  *   -o no_remote_lock      Equivalent to -o no_remote_flock,no_remote_posix_lock
685*9e564957SAndroid Build Coastguard Worker  *   -o no_remote_flock     Unsets FUSE_CAP_FLOCK_LOCKS in conn->want
686*9e564957SAndroid Build Coastguard Worker  *   -o no_remote_posix_lock  Unsets FUSE_CAP_POSIX_LOCKS in conn->want
687*9e564957SAndroid Build Coastguard Worker  *   -o [no_]splice_write     (un-)sets FUSE_CAP_SPLICE_WRITE in conn->want
688*9e564957SAndroid Build Coastguard Worker  *   -o [no_]splice_move      (un-)sets FUSE_CAP_SPLICE_MOVE in conn->want
689*9e564957SAndroid Build Coastguard Worker  *   -o [no_]splice_read      (un-)sets FUSE_CAP_SPLICE_READ in conn->want
690*9e564957SAndroid Build Coastguard Worker  *   -o [no_]auto_inval_data  (un-)sets FUSE_CAP_AUTO_INVAL_DATA in conn->want
691*9e564957SAndroid Build Coastguard Worker  *   -o readdirplus=no        unsets FUSE_CAP_READDIRPLUS in conn->want
692*9e564957SAndroid Build Coastguard Worker  *   -o readdirplus=yes       sets FUSE_CAP_READDIRPLUS and unsets
693*9e564957SAndroid Build Coastguard Worker  *                            FUSE_CAP_READDIRPLUS_AUTO in conn->want
694*9e564957SAndroid Build Coastguard Worker  *   -o readdirplus=auto      sets FUSE_CAP_READDIRPLUS and
695*9e564957SAndroid Build Coastguard Worker  *                            FUSE_CAP_READDIRPLUS_AUTO in conn->want
696*9e564957SAndroid Build Coastguard Worker  *   -o [no_]async_dio        (un-)sets FUSE_CAP_ASYNC_DIO in conn->want
697*9e564957SAndroid Build Coastguard Worker  *   -o [no_]writeback_cache  (un-)sets FUSE_CAP_WRITEBACK_CACHE in conn->want
698*9e564957SAndroid Build Coastguard Worker  *   -o time_gran=N           sets conn->time_gran
699*9e564957SAndroid Build Coastguard Worker  *
700*9e564957SAndroid Build Coastguard Worker  * Known options will be removed from *args*, unknown options will be
701*9e564957SAndroid Build Coastguard Worker  * passed through unchanged.
702*9e564957SAndroid Build Coastguard Worker  *
703*9e564957SAndroid Build Coastguard Worker  * @param args argument vector (input+output)
704*9e564957SAndroid Build Coastguard Worker  * @return parsed options
705*9e564957SAndroid Build Coastguard Worker  **/
706*9e564957SAndroid Build Coastguard Worker struct fuse_conn_info_opts* fuse_parse_conn_info_opts(struct fuse_args *args);
707*9e564957SAndroid Build Coastguard Worker 
708*9e564957SAndroid Build Coastguard Worker /**
709*9e564957SAndroid Build Coastguard Worker  * This function applies the (parsed) parameters in *opts* to the
710*9e564957SAndroid Build Coastguard Worker  * *conn* pointer. It may modify the following fields: wants,
711*9e564957SAndroid Build Coastguard Worker  * max_write, max_readahead, congestion_threshold, max_background,
712*9e564957SAndroid Build Coastguard Worker  * time_gran. A field is only set (or unset) if the corresponding
713*9e564957SAndroid Build Coastguard Worker  * option has been explicitly set.
714*9e564957SAndroid Build Coastguard Worker  */
715*9e564957SAndroid Build Coastguard Worker void fuse_apply_conn_info_opts(struct fuse_conn_info_opts *opts,
716*9e564957SAndroid Build Coastguard Worker 			  struct fuse_conn_info *conn);
717*9e564957SAndroid Build Coastguard Worker 
718*9e564957SAndroid Build Coastguard Worker /**
719*9e564957SAndroid Build Coastguard Worker  * Go into the background
720*9e564957SAndroid Build Coastguard Worker  *
721*9e564957SAndroid Build Coastguard Worker  * @param foreground if true, stay in the foreground
722*9e564957SAndroid Build Coastguard Worker  * @return 0 on success, -1 on failure
723*9e564957SAndroid Build Coastguard Worker  */
724*9e564957SAndroid Build Coastguard Worker int fuse_daemonize(int foreground);
725*9e564957SAndroid Build Coastguard Worker 
726*9e564957SAndroid Build Coastguard Worker /**
727*9e564957SAndroid Build Coastguard Worker  * Get the version of the library
728*9e564957SAndroid Build Coastguard Worker  *
729*9e564957SAndroid Build Coastguard Worker  * @return the version
730*9e564957SAndroid Build Coastguard Worker  */
731*9e564957SAndroid Build Coastguard Worker int fuse_version(void);
732*9e564957SAndroid Build Coastguard Worker 
733*9e564957SAndroid Build Coastguard Worker /**
734*9e564957SAndroid Build Coastguard Worker  * Get the full package version string of the library
735*9e564957SAndroid Build Coastguard Worker  *
736*9e564957SAndroid Build Coastguard Worker  * @return the package version
737*9e564957SAndroid Build Coastguard Worker  */
738*9e564957SAndroid Build Coastguard Worker const char *fuse_pkgversion(void);
739*9e564957SAndroid Build Coastguard Worker 
740*9e564957SAndroid Build Coastguard Worker /**
741*9e564957SAndroid Build Coastguard Worker  * Destroy poll handle
742*9e564957SAndroid Build Coastguard Worker  *
743*9e564957SAndroid Build Coastguard Worker  * @param ph the poll handle
744*9e564957SAndroid Build Coastguard Worker  */
745*9e564957SAndroid Build Coastguard Worker void fuse_pollhandle_destroy(struct fuse_pollhandle *ph);
746*9e564957SAndroid Build Coastguard Worker 
747*9e564957SAndroid Build Coastguard Worker /* ----------------------------------------------------------- *
748*9e564957SAndroid Build Coastguard Worker  * Data buffer						       *
749*9e564957SAndroid Build Coastguard Worker  * ----------------------------------------------------------- */
750*9e564957SAndroid Build Coastguard Worker 
751*9e564957SAndroid Build Coastguard Worker /**
752*9e564957SAndroid Build Coastguard Worker  * Buffer flags
753*9e564957SAndroid Build Coastguard Worker  */
754*9e564957SAndroid Build Coastguard Worker enum fuse_buf_flags {
755*9e564957SAndroid Build Coastguard Worker 	/**
756*9e564957SAndroid Build Coastguard Worker 	 * Buffer contains a file descriptor
757*9e564957SAndroid Build Coastguard Worker 	 *
758*9e564957SAndroid Build Coastguard Worker 	 * If this flag is set, the .fd field is valid, otherwise the
759*9e564957SAndroid Build Coastguard Worker 	 * .mem fields is valid.
760*9e564957SAndroid Build Coastguard Worker 	 */
761*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_IS_FD		= (1 << 1),
762*9e564957SAndroid Build Coastguard Worker 
763*9e564957SAndroid Build Coastguard Worker 	/**
764*9e564957SAndroid Build Coastguard Worker 	 * Seek on the file descriptor
765*9e564957SAndroid Build Coastguard Worker 	 *
766*9e564957SAndroid Build Coastguard Worker 	 * If this flag is set then the .pos field is valid and is
767*9e564957SAndroid Build Coastguard Worker 	 * used to seek to the given offset before performing
768*9e564957SAndroid Build Coastguard Worker 	 * operation on file descriptor.
769*9e564957SAndroid Build Coastguard Worker 	 */
770*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_FD_SEEK	= (1 << 2),
771*9e564957SAndroid Build Coastguard Worker 
772*9e564957SAndroid Build Coastguard Worker 	/**
773*9e564957SAndroid Build Coastguard Worker 	 * Retry operation on file descriptor
774*9e564957SAndroid Build Coastguard Worker 	 *
775*9e564957SAndroid Build Coastguard Worker 	 * If this flag is set then retry operation on file descriptor
776*9e564957SAndroid Build Coastguard Worker 	 * until .size bytes have been copied or an error or EOF is
777*9e564957SAndroid Build Coastguard Worker 	 * detected.
778*9e564957SAndroid Build Coastguard Worker 	 */
779*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_FD_RETRY	= (1 << 3)
780*9e564957SAndroid Build Coastguard Worker };
781*9e564957SAndroid Build Coastguard Worker 
782*9e564957SAndroid Build Coastguard Worker /**
783*9e564957SAndroid Build Coastguard Worker  * Buffer copy flags
784*9e564957SAndroid Build Coastguard Worker  */
785*9e564957SAndroid Build Coastguard Worker enum fuse_buf_copy_flags {
786*9e564957SAndroid Build Coastguard Worker 	/**
787*9e564957SAndroid Build Coastguard Worker 	 * Don't use splice(2)
788*9e564957SAndroid Build Coastguard Worker 	 *
789*9e564957SAndroid Build Coastguard Worker 	 * Always fall back to using read and write instead of
790*9e564957SAndroid Build Coastguard Worker 	 * splice(2) to copy data from one file descriptor to another.
791*9e564957SAndroid Build Coastguard Worker 	 *
792*9e564957SAndroid Build Coastguard Worker 	 * If this flag is not set, then only fall back if splice is
793*9e564957SAndroid Build Coastguard Worker 	 * unavailable.
794*9e564957SAndroid Build Coastguard Worker 	 */
795*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_NO_SPLICE	= (1 << 1),
796*9e564957SAndroid Build Coastguard Worker 
797*9e564957SAndroid Build Coastguard Worker 	/**
798*9e564957SAndroid Build Coastguard Worker 	 * Force splice
799*9e564957SAndroid Build Coastguard Worker 	 *
800*9e564957SAndroid Build Coastguard Worker 	 * Always use splice(2) to copy data from one file descriptor
801*9e564957SAndroid Build Coastguard Worker 	 * to another.  If splice is not available, return -EINVAL.
802*9e564957SAndroid Build Coastguard Worker 	 */
803*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_FORCE_SPLICE	= (1 << 2),
804*9e564957SAndroid Build Coastguard Worker 
805*9e564957SAndroid Build Coastguard Worker 	/**
806*9e564957SAndroid Build Coastguard Worker 	 * Try to move data with splice.
807*9e564957SAndroid Build Coastguard Worker 	 *
808*9e564957SAndroid Build Coastguard Worker 	 * If splice is used, try to move pages from the source to the
809*9e564957SAndroid Build Coastguard Worker 	 * destination instead of copying.  See documentation of
810*9e564957SAndroid Build Coastguard Worker 	 * SPLICE_F_MOVE in splice(2) man page.
811*9e564957SAndroid Build Coastguard Worker 	 */
812*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_SPLICE_MOVE	= (1 << 3),
813*9e564957SAndroid Build Coastguard Worker 
814*9e564957SAndroid Build Coastguard Worker 	/**
815*9e564957SAndroid Build Coastguard Worker 	 * Don't block on the pipe when copying data with splice
816*9e564957SAndroid Build Coastguard Worker 	 *
817*9e564957SAndroid Build Coastguard Worker 	 * Makes the operations on the pipe non-blocking (if the pipe
818*9e564957SAndroid Build Coastguard Worker 	 * is full or empty).  See SPLICE_F_NONBLOCK in the splice(2)
819*9e564957SAndroid Build Coastguard Worker 	 * man page.
820*9e564957SAndroid Build Coastguard Worker 	 */
821*9e564957SAndroid Build Coastguard Worker 	FUSE_BUF_SPLICE_NONBLOCK= (1 << 4)
822*9e564957SAndroid Build Coastguard Worker };
823*9e564957SAndroid Build Coastguard Worker 
824*9e564957SAndroid Build Coastguard Worker /**
825*9e564957SAndroid Build Coastguard Worker  * Single data buffer
826*9e564957SAndroid Build Coastguard Worker  *
827*9e564957SAndroid Build Coastguard Worker  * Generic data buffer for I/O, extended attributes, etc...  Data may
828*9e564957SAndroid Build Coastguard Worker  * be supplied as a memory pointer or as a file descriptor
829*9e564957SAndroid Build Coastguard Worker  */
830*9e564957SAndroid Build Coastguard Worker struct fuse_buf {
831*9e564957SAndroid Build Coastguard Worker 	/**
832*9e564957SAndroid Build Coastguard Worker 	 * Size of data in bytes
833*9e564957SAndroid Build Coastguard Worker 	 */
834*9e564957SAndroid Build Coastguard Worker 	size_t size;
835*9e564957SAndroid Build Coastguard Worker 
836*9e564957SAndroid Build Coastguard Worker 	/**
837*9e564957SAndroid Build Coastguard Worker 	 * Buffer flags
838*9e564957SAndroid Build Coastguard Worker 	 */
839*9e564957SAndroid Build Coastguard Worker 	enum fuse_buf_flags flags;
840*9e564957SAndroid Build Coastguard Worker 
841*9e564957SAndroid Build Coastguard Worker 	/**
842*9e564957SAndroid Build Coastguard Worker 	 * Memory pointer
843*9e564957SAndroid Build Coastguard Worker 	 *
844*9e564957SAndroid Build Coastguard Worker 	 * Used unless FUSE_BUF_IS_FD flag is set.
845*9e564957SAndroid Build Coastguard Worker 	 */
846*9e564957SAndroid Build Coastguard Worker 	void *mem;
847*9e564957SAndroid Build Coastguard Worker 
848*9e564957SAndroid Build Coastguard Worker 	/**
849*9e564957SAndroid Build Coastguard Worker 	 * File descriptor
850*9e564957SAndroid Build Coastguard Worker 	 *
851*9e564957SAndroid Build Coastguard Worker 	 * Used if FUSE_BUF_IS_FD flag is set.
852*9e564957SAndroid Build Coastguard Worker 	 */
853*9e564957SAndroid Build Coastguard Worker 	int fd;
854*9e564957SAndroid Build Coastguard Worker 
855*9e564957SAndroid Build Coastguard Worker 	/**
856*9e564957SAndroid Build Coastguard Worker 	 * File position
857*9e564957SAndroid Build Coastguard Worker 	 *
858*9e564957SAndroid Build Coastguard Worker 	 * Used if FUSE_BUF_FD_SEEK flag is set.
859*9e564957SAndroid Build Coastguard Worker 	 */
860*9e564957SAndroid Build Coastguard Worker 	off_t pos;
861*9e564957SAndroid Build Coastguard Worker };
862*9e564957SAndroid Build Coastguard Worker 
863*9e564957SAndroid Build Coastguard Worker /**
864*9e564957SAndroid Build Coastguard Worker  * Data buffer vector
865*9e564957SAndroid Build Coastguard Worker  *
866*9e564957SAndroid Build Coastguard Worker  * An array of data buffers, each containing a memory pointer or a
867*9e564957SAndroid Build Coastguard Worker  * file descriptor.
868*9e564957SAndroid Build Coastguard Worker  *
869*9e564957SAndroid Build Coastguard Worker  * Allocate dynamically to add more than one buffer.
870*9e564957SAndroid Build Coastguard Worker  */
871*9e564957SAndroid Build Coastguard Worker struct fuse_bufvec {
872*9e564957SAndroid Build Coastguard Worker 	/**
873*9e564957SAndroid Build Coastguard Worker 	 * Number of buffers in the array
874*9e564957SAndroid Build Coastguard Worker 	 */
875*9e564957SAndroid Build Coastguard Worker 	size_t count;
876*9e564957SAndroid Build Coastguard Worker 
877*9e564957SAndroid Build Coastguard Worker 	/**
878*9e564957SAndroid Build Coastguard Worker 	 * Index of current buffer within the array
879*9e564957SAndroid Build Coastguard Worker 	 */
880*9e564957SAndroid Build Coastguard Worker 	size_t idx;
881*9e564957SAndroid Build Coastguard Worker 
882*9e564957SAndroid Build Coastguard Worker 	/**
883*9e564957SAndroid Build Coastguard Worker 	 * Current offset within the current buffer
884*9e564957SAndroid Build Coastguard Worker 	 */
885*9e564957SAndroid Build Coastguard Worker 	size_t off;
886*9e564957SAndroid Build Coastguard Worker 
887*9e564957SAndroid Build Coastguard Worker 	/**
888*9e564957SAndroid Build Coastguard Worker 	 * Array of buffers
889*9e564957SAndroid Build Coastguard Worker 	 */
890*9e564957SAndroid Build Coastguard Worker 	struct fuse_buf buf[1];
891*9e564957SAndroid Build Coastguard Worker };
892*9e564957SAndroid Build Coastguard Worker 
893*9e564957SAndroid Build Coastguard Worker /**
894*9e564957SAndroid Build Coastguard Worker  * libfuse version a file system was compiled with. Should be filled in from
895*9e564957SAndroid Build Coastguard Worker  * defines in 'libfuse_config.h'
896*9e564957SAndroid Build Coastguard Worker  */
897*9e564957SAndroid Build Coastguard Worker struct libfuse_version
898*9e564957SAndroid Build Coastguard Worker {
899*9e564957SAndroid Build Coastguard Worker 	int major;
900*9e564957SAndroid Build Coastguard Worker 	int minor;
901*9e564957SAndroid Build Coastguard Worker 	int hotfix;
902*9e564957SAndroid Build Coastguard Worker 	int padding;
903*9e564957SAndroid Build Coastguard Worker };
904*9e564957SAndroid Build Coastguard Worker 
905*9e564957SAndroid Build Coastguard Worker /* Initialize bufvec with a single buffer of given size */
906*9e564957SAndroid Build Coastguard Worker #define FUSE_BUFVEC_INIT(size__)				\
907*9e564957SAndroid Build Coastguard Worker 	((struct fuse_bufvec) {					\
908*9e564957SAndroid Build Coastguard Worker 		/* .count= */ 1,				\
909*9e564957SAndroid Build Coastguard Worker 		/* .idx =  */ 0,				\
910*9e564957SAndroid Build Coastguard Worker 		/* .off =  */ 0,				\
911*9e564957SAndroid Build Coastguard Worker 		/* .buf =  */ { /* [0] = */ {			\
912*9e564957SAndroid Build Coastguard Worker 			/* .size =  */ (size__),		\
913*9e564957SAndroid Build Coastguard Worker 			/* .flags = */ (enum fuse_buf_flags) 0,	\
914*9e564957SAndroid Build Coastguard Worker 			/* .mem =   */ NULL,			\
915*9e564957SAndroid Build Coastguard Worker 			/* .fd =    */ -1,			\
916*9e564957SAndroid Build Coastguard Worker 			/* .pos =   */ 0,			\
917*9e564957SAndroid Build Coastguard Worker 		} }						\
918*9e564957SAndroid Build Coastguard Worker 	} )
919*9e564957SAndroid Build Coastguard Worker 
920*9e564957SAndroid Build Coastguard Worker /**
921*9e564957SAndroid Build Coastguard Worker  * Get total size of data in a fuse buffer vector
922*9e564957SAndroid Build Coastguard Worker  *
923*9e564957SAndroid Build Coastguard Worker  * @param bufv buffer vector
924*9e564957SAndroid Build Coastguard Worker  * @return size of data
925*9e564957SAndroid Build Coastguard Worker  */
926*9e564957SAndroid Build Coastguard Worker size_t fuse_buf_size(const struct fuse_bufvec *bufv);
927*9e564957SAndroid Build Coastguard Worker 
928*9e564957SAndroid Build Coastguard Worker /**
929*9e564957SAndroid Build Coastguard Worker  * Copy data from one buffer vector to another
930*9e564957SAndroid Build Coastguard Worker  *
931*9e564957SAndroid Build Coastguard Worker  * @param dst destination buffer vector
932*9e564957SAndroid Build Coastguard Worker  * @param src source buffer vector
933*9e564957SAndroid Build Coastguard Worker  * @param flags flags controlling the copy
934*9e564957SAndroid Build Coastguard Worker  * @return actual number of bytes copied or -errno on error
935*9e564957SAndroid Build Coastguard Worker  */
936*9e564957SAndroid Build Coastguard Worker ssize_t fuse_buf_copy(struct fuse_bufvec *dst, struct fuse_bufvec *src,
937*9e564957SAndroid Build Coastguard Worker 		      enum fuse_buf_copy_flags flags);
938*9e564957SAndroid Build Coastguard Worker 
939*9e564957SAndroid Build Coastguard Worker /* ----------------------------------------------------------- *
940*9e564957SAndroid Build Coastguard Worker  * Signal handling					       *
941*9e564957SAndroid Build Coastguard Worker  * ----------------------------------------------------------- */
942*9e564957SAndroid Build Coastguard Worker 
943*9e564957SAndroid Build Coastguard Worker /**
944*9e564957SAndroid Build Coastguard Worker  * Exit session on HUP, TERM and INT signals and ignore PIPE signal
945*9e564957SAndroid Build Coastguard Worker  *
946*9e564957SAndroid Build Coastguard Worker  * Stores session in a global variable.	 May only be called once per
947*9e564957SAndroid Build Coastguard Worker  * process until fuse_remove_signal_handlers() is called.
948*9e564957SAndroid Build Coastguard Worker  *
949*9e564957SAndroid Build Coastguard Worker  * Once either of the POSIX signals arrives, the signal handler calls
950*9e564957SAndroid Build Coastguard Worker  * fuse_session_exit().
951*9e564957SAndroid Build Coastguard Worker  *
952*9e564957SAndroid Build Coastguard Worker  * @param se the session to exit
953*9e564957SAndroid Build Coastguard Worker  * @return 0 on success, -1 on failure
954*9e564957SAndroid Build Coastguard Worker  *
955*9e564957SAndroid Build Coastguard Worker  * See also:
956*9e564957SAndroid Build Coastguard Worker  * fuse_remove_signal_handlers()
957*9e564957SAndroid Build Coastguard Worker  */
958*9e564957SAndroid Build Coastguard Worker int fuse_set_signal_handlers(struct fuse_session *se);
959*9e564957SAndroid Build Coastguard Worker 
960*9e564957SAndroid Build Coastguard Worker /**
961*9e564957SAndroid Build Coastguard Worker  * Restore default signal handlers
962*9e564957SAndroid Build Coastguard Worker  *
963*9e564957SAndroid Build Coastguard Worker  * Resets global session.  After this fuse_set_signal_handlers() may
964*9e564957SAndroid Build Coastguard Worker  * be called again.
965*9e564957SAndroid Build Coastguard Worker  *
966*9e564957SAndroid Build Coastguard Worker  * @param se the same session as given in fuse_set_signal_handlers()
967*9e564957SAndroid Build Coastguard Worker  *
968*9e564957SAndroid Build Coastguard Worker  * See also:
969*9e564957SAndroid Build Coastguard Worker  * fuse_set_signal_handlers()
970*9e564957SAndroid Build Coastguard Worker  */
971*9e564957SAndroid Build Coastguard Worker void fuse_remove_signal_handlers(struct fuse_session *se);
972*9e564957SAndroid Build Coastguard Worker 
973*9e564957SAndroid Build Coastguard Worker /**
974*9e564957SAndroid Build Coastguard Worker  * Create and set default config for fuse_session_loop_mt and fuse_loop_mt.
975*9e564957SAndroid Build Coastguard Worker  *
976*9e564957SAndroid Build Coastguard Worker  * @return anonymous config struct
977*9e564957SAndroid Build Coastguard Worker  */
978*9e564957SAndroid Build Coastguard Worker struct fuse_loop_config *fuse_loop_cfg_create(void);
979*9e564957SAndroid Build Coastguard Worker 
980*9e564957SAndroid Build Coastguard Worker /**
981*9e564957SAndroid Build Coastguard Worker  * Free the config data structure
982*9e564957SAndroid Build Coastguard Worker  */
983*9e564957SAndroid Build Coastguard Worker void fuse_loop_cfg_destroy(struct fuse_loop_config *config);
984*9e564957SAndroid Build Coastguard Worker 
985*9e564957SAndroid Build Coastguard Worker /**
986*9e564957SAndroid Build Coastguard Worker  * fuse_loop_config setter to set the number of max idle threads.
987*9e564957SAndroid Build Coastguard Worker  */
988*9e564957SAndroid Build Coastguard Worker void fuse_loop_cfg_set_idle_threads(struct fuse_loop_config *config,
989*9e564957SAndroid Build Coastguard Worker 				    unsigned int value);
990*9e564957SAndroid Build Coastguard Worker 
991*9e564957SAndroid Build Coastguard Worker /**
992*9e564957SAndroid Build Coastguard Worker  * fuse_loop_config setter to set the number of max threads.
993*9e564957SAndroid Build Coastguard Worker  */
994*9e564957SAndroid Build Coastguard Worker void fuse_loop_cfg_set_max_threads(struct fuse_loop_config *config,
995*9e564957SAndroid Build Coastguard Worker 				   unsigned int value);
996*9e564957SAndroid Build Coastguard Worker 
997*9e564957SAndroid Build Coastguard Worker /**
998*9e564957SAndroid Build Coastguard Worker  * fuse_loop_config setter to enable the clone_fd feature
999*9e564957SAndroid Build Coastguard Worker  */
1000*9e564957SAndroid Build Coastguard Worker void fuse_loop_cfg_set_clone_fd(struct fuse_loop_config *config,
1001*9e564957SAndroid Build Coastguard Worker 				unsigned int value);
1002*9e564957SAndroid Build Coastguard Worker 
1003*9e564957SAndroid Build Coastguard Worker /**
1004*9e564957SAndroid Build Coastguard Worker  * Convert old config to more recernt fuse_loop_config2
1005*9e564957SAndroid Build Coastguard Worker  *
1006*9e564957SAndroid Build Coastguard Worker  * @param config current config2 type
1007*9e564957SAndroid Build Coastguard Worker  * @param v1_conf older config1 type (below FUSE API 312)
1008*9e564957SAndroid Build Coastguard Worker  */
1009*9e564957SAndroid Build Coastguard Worker void fuse_loop_cfg_convert(struct fuse_loop_config *config,
1010*9e564957SAndroid Build Coastguard Worker 			   struct fuse_loop_config_v1 *v1_conf);
1011*9e564957SAndroid Build Coastguard Worker 
1012*9e564957SAndroid Build Coastguard Worker /* ----------------------------------------------------------- *
1013*9e564957SAndroid Build Coastguard Worker  * Compatibility stuff					       *
1014*9e564957SAndroid Build Coastguard Worker  * ----------------------------------------------------------- */
1015*9e564957SAndroid Build Coastguard Worker 
1016*9e564957SAndroid Build Coastguard Worker #if !defined(FUSE_USE_VERSION) || FUSE_USE_VERSION < 30
1017*9e564957SAndroid Build Coastguard Worker #  error only API version 30 or greater is supported
1018*9e564957SAndroid Build Coastguard Worker #endif
1019*9e564957SAndroid Build Coastguard Worker 
1020*9e564957SAndroid Build Coastguard Worker #ifdef __cplusplus
1021*9e564957SAndroid Build Coastguard Worker }
1022*9e564957SAndroid Build Coastguard Worker #endif
1023*9e564957SAndroid Build Coastguard Worker 
1024*9e564957SAndroid Build Coastguard Worker 
1025*9e564957SAndroid Build Coastguard Worker /*
1026*9e564957SAndroid Build Coastguard Worker  * This interface uses 64 bit off_t.
1027*9e564957SAndroid Build Coastguard Worker  *
1028*9e564957SAndroid Build Coastguard Worker  * On 32bit systems please add -D_FILE_OFFSET_BITS=64 to your compile flags!
1029*9e564957SAndroid Build Coastguard Worker  */
1030*9e564957SAndroid Build Coastguard Worker 
1031*9e564957SAndroid Build Coastguard Worker #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
1032*9e564957SAndroid Build Coastguard Worker _Static_assert(sizeof(off_t) == 8, "fuse: off_t must be 64bit");
1033*9e564957SAndroid Build Coastguard Worker #else
1034*9e564957SAndroid Build Coastguard Worker struct _fuse_off_t_must_be_64bit_dummy_struct \
1035*9e564957SAndroid Build Coastguard Worker 	{ unsigned _fuse_off_t_must_be_64bit:((sizeof(off_t) == 8) ? 1 : -1); };
1036*9e564957SAndroid Build Coastguard Worker #endif
1037*9e564957SAndroid Build Coastguard Worker 
1038*9e564957SAndroid Build Coastguard Worker #endif /* FUSE_COMMON_H_ */
1039