xref: /aosp_15_r20/external/libfuse/lib/fuse_i.h (revision 9e5649576b786774a32d7b0252c9cd8c6538fa49)
1*9e564957SAndroid Build Coastguard Worker /*
2*9e564957SAndroid Build Coastguard Worker   FUSE: Filesystem in Userspace
3*9e564957SAndroid Build Coastguard Worker   Copyright (C) 2001-2007  Miklos Szeredi <[email protected]>
4*9e564957SAndroid Build Coastguard Worker 
5*9e564957SAndroid Build Coastguard Worker   This program can be distributed under the terms of the GNU LGPLv2.
6*9e564957SAndroid Build Coastguard Worker   See the file COPYING.LIB
7*9e564957SAndroid Build Coastguard Worker */
8*9e564957SAndroid Build Coastguard Worker 
9*9e564957SAndroid Build Coastguard Worker #include "fuse.h"
10*9e564957SAndroid Build Coastguard Worker #include "fuse_lowlevel.h"
11*9e564957SAndroid Build Coastguard Worker 
12*9e564957SAndroid Build Coastguard Worker struct mount_opts;
13*9e564957SAndroid Build Coastguard Worker 
14*9e564957SAndroid Build Coastguard Worker struct fuse_req {
15*9e564957SAndroid Build Coastguard Worker 	struct fuse_session *se;
16*9e564957SAndroid Build Coastguard Worker 	uint64_t unique;
17*9e564957SAndroid Build Coastguard Worker 	int ctr;
18*9e564957SAndroid Build Coastguard Worker 	pthread_mutex_t lock;
19*9e564957SAndroid Build Coastguard Worker 	struct fuse_ctx ctx;
20*9e564957SAndroid Build Coastguard Worker 	struct fuse_chan *ch;
21*9e564957SAndroid Build Coastguard Worker 	int interrupted;
22*9e564957SAndroid Build Coastguard Worker 	unsigned int ioctl_64bit : 1;
23*9e564957SAndroid Build Coastguard Worker 	union {
24*9e564957SAndroid Build Coastguard Worker 		struct {
25*9e564957SAndroid Build Coastguard Worker 			uint64_t unique;
26*9e564957SAndroid Build Coastguard Worker 		} i;
27*9e564957SAndroid Build Coastguard Worker 		struct {
28*9e564957SAndroid Build Coastguard Worker 			fuse_interrupt_func_t func;
29*9e564957SAndroid Build Coastguard Worker 			void *data;
30*9e564957SAndroid Build Coastguard Worker 		} ni;
31*9e564957SAndroid Build Coastguard Worker 	} u;
32*9e564957SAndroid Build Coastguard Worker 	struct fuse_req *next;
33*9e564957SAndroid Build Coastguard Worker 	struct fuse_req *prev;
34*9e564957SAndroid Build Coastguard Worker };
35*9e564957SAndroid Build Coastguard Worker 
36*9e564957SAndroid Build Coastguard Worker struct fuse_notify_req {
37*9e564957SAndroid Build Coastguard Worker 	uint64_t unique;
38*9e564957SAndroid Build Coastguard Worker 	void (*reply)(struct fuse_notify_req *, fuse_req_t, fuse_ino_t,
39*9e564957SAndroid Build Coastguard Worker 		      const void *, const struct fuse_buf *);
40*9e564957SAndroid Build Coastguard Worker 	struct fuse_notify_req *next;
41*9e564957SAndroid Build Coastguard Worker 	struct fuse_notify_req *prev;
42*9e564957SAndroid Build Coastguard Worker };
43*9e564957SAndroid Build Coastguard Worker 
44*9e564957SAndroid Build Coastguard Worker struct fuse_session {
45*9e564957SAndroid Build Coastguard Worker 	char *mountpoint;
46*9e564957SAndroid Build Coastguard Worker 	volatile int exited;
47*9e564957SAndroid Build Coastguard Worker 	int fd;
48*9e564957SAndroid Build Coastguard Worker 	struct fuse_custom_io *io;
49*9e564957SAndroid Build Coastguard Worker 	struct mount_opts *mo;
50*9e564957SAndroid Build Coastguard Worker 	int debug;
51*9e564957SAndroid Build Coastguard Worker 	int deny_others;
52*9e564957SAndroid Build Coastguard Worker 	struct fuse_lowlevel_ops op;
53*9e564957SAndroid Build Coastguard Worker 	int got_init;
54*9e564957SAndroid Build Coastguard Worker 	struct cuse_data *cuse_data;
55*9e564957SAndroid Build Coastguard Worker 	void *userdata;
56*9e564957SAndroid Build Coastguard Worker 	uid_t owner;
57*9e564957SAndroid Build Coastguard Worker 	struct fuse_conn_info conn;
58*9e564957SAndroid Build Coastguard Worker 	struct fuse_req list;
59*9e564957SAndroid Build Coastguard Worker 	struct fuse_req interrupts;
60*9e564957SAndroid Build Coastguard Worker 	pthread_mutex_t lock;
61*9e564957SAndroid Build Coastguard Worker 	int got_destroy;
62*9e564957SAndroid Build Coastguard Worker 	pthread_key_t pipe_key;
63*9e564957SAndroid Build Coastguard Worker 	int broken_splice_nonblock;
64*9e564957SAndroid Build Coastguard Worker 	uint64_t notify_ctr;
65*9e564957SAndroid Build Coastguard Worker 	struct fuse_notify_req notify_list;
66*9e564957SAndroid Build Coastguard Worker 	size_t bufsize;
67*9e564957SAndroid Build Coastguard Worker 	int error;
68*9e564957SAndroid Build Coastguard Worker 
69*9e564957SAndroid Build Coastguard Worker 	/* This is useful if any kind of ABI incompatibility is found at
70*9e564957SAndroid Build Coastguard Worker 	 * a later version, to 'fix' it at run time.
71*9e564957SAndroid Build Coastguard Worker 	 */
72*9e564957SAndroid Build Coastguard Worker 	struct libfuse_version version;
73*9e564957SAndroid Build Coastguard Worker };
74*9e564957SAndroid Build Coastguard Worker 
75*9e564957SAndroid Build Coastguard Worker struct fuse_chan {
76*9e564957SAndroid Build Coastguard Worker 	pthread_mutex_t lock;
77*9e564957SAndroid Build Coastguard Worker 	int ctr;
78*9e564957SAndroid Build Coastguard Worker 	int fd;
79*9e564957SAndroid Build Coastguard Worker };
80*9e564957SAndroid Build Coastguard Worker 
81*9e564957SAndroid Build Coastguard Worker /**
82*9e564957SAndroid Build Coastguard Worker  * Filesystem module
83*9e564957SAndroid Build Coastguard Worker  *
84*9e564957SAndroid Build Coastguard Worker  * Filesystem modules are registered with the FUSE_REGISTER_MODULE()
85*9e564957SAndroid Build Coastguard Worker  * macro.
86*9e564957SAndroid Build Coastguard Worker  *
87*9e564957SAndroid Build Coastguard Worker  */
88*9e564957SAndroid Build Coastguard Worker struct fuse_module {
89*9e564957SAndroid Build Coastguard Worker 	char *name;
90*9e564957SAndroid Build Coastguard Worker 	fuse_module_factory_t factory;
91*9e564957SAndroid Build Coastguard Worker 	struct fuse_module *next;
92*9e564957SAndroid Build Coastguard Worker 	struct fusemod_so *so;
93*9e564957SAndroid Build Coastguard Worker 	int ctr;
94*9e564957SAndroid Build Coastguard Worker };
95*9e564957SAndroid Build Coastguard Worker 
96*9e564957SAndroid Build Coastguard Worker /**
97*9e564957SAndroid Build Coastguard Worker  * Configuration parameters passed to fuse_session_loop_mt() and
98*9e564957SAndroid Build Coastguard Worker  * fuse_loop_mt().
99*9e564957SAndroid Build Coastguard Worker  *
100*9e564957SAndroid Build Coastguard Worker  * Internal API to avoid exposing the plain data structure and
101*9e564957SAndroid Build Coastguard Worker  * causing compat issues after adding or removing struct members.
102*9e564957SAndroid Build Coastguard Worker  *
103*9e564957SAndroid Build Coastguard Worker  */
104*9e564957SAndroid Build Coastguard Worker #if FUSE_USE_VERSION >= FUSE_MAKE_VERSION(3, 12)
105*9e564957SAndroid Build Coastguard Worker struct fuse_loop_config
106*9e564957SAndroid Build Coastguard Worker {
107*9e564957SAndroid Build Coastguard Worker 	/* verififier that a correct struct was was passed. This is especially
108*9e564957SAndroid Build Coastguard Worker 	 * needed, as versions below (3, 12) were using a public struct
109*9e564957SAndroid Build Coastguard Worker 	 * (now called  fuse_loop_config_v1), which was hard to extend with
110*9e564957SAndroid Build Coastguard Worker 	 * additional parameters, without risking that file system implementations
111*9e564957SAndroid Build Coastguard Worker 	 * would not have noticed and might either pass uninitialized members
112*9e564957SAndroid Build Coastguard Worker 	 * or even too small structs.
113*9e564957SAndroid Build Coastguard Worker 	 * fuse_loop_config_v1 has clone_fd at this offset, which should be either 0
114*9e564957SAndroid Build Coastguard Worker 	 * or 1. v2 or even higher version just need to set a value here
115*9e564957SAndroid Build Coastguard Worker 	 * which not conflicting and very unlikely as having been set by
116*9e564957SAndroid Build Coastguard Worker 	 * file system implementation.
117*9e564957SAndroid Build Coastguard Worker 	 */
118*9e564957SAndroid Build Coastguard Worker 	int version_id;
119*9e564957SAndroid Build Coastguard Worker 
120*9e564957SAndroid Build Coastguard Worker 	/**
121*9e564957SAndroid Build Coastguard Worker 	 * whether to use separate device fds for each thread
122*9e564957SAndroid Build Coastguard Worker 	 * (may increase performance)
123*9e564957SAndroid Build Coastguard Worker 	 */
124*9e564957SAndroid Build Coastguard Worker 	int clone_fd;
125*9e564957SAndroid Build Coastguard Worker 	/**
126*9e564957SAndroid Build Coastguard Worker 	 * The maximum number of available worker threads before they
127*9e564957SAndroid Build Coastguard Worker 	 * start to get deleted when they become idle. If not
128*9e564957SAndroid Build Coastguard Worker 	 * specified, the default is 10.
129*9e564957SAndroid Build Coastguard Worker 	 *
130*9e564957SAndroid Build Coastguard Worker 	 * Adjusting this has performance implications; a very small number
131*9e564957SAndroid Build Coastguard Worker 	 * of threads in the pool will cause a lot of thread creation and
132*9e564957SAndroid Build Coastguard Worker 	 * deletion overhead and performance may suffer. When set to 0, a new
133*9e564957SAndroid Build Coastguard Worker 	 * thread will be created to service every operation.
134*9e564957SAndroid Build Coastguard Worker 	 * The special value of -1 means that this parameter is disabled.
135*9e564957SAndroid Build Coastguard Worker 	 */
136*9e564957SAndroid Build Coastguard Worker 	int max_idle_threads;
137*9e564957SAndroid Build Coastguard Worker 
138*9e564957SAndroid Build Coastguard Worker 	/**
139*9e564957SAndroid Build Coastguard Worker 	 *  max number of threads taking and processing kernel requests
140*9e564957SAndroid Build Coastguard Worker 	 *
141*9e564957SAndroid Build Coastguard Worker 	 *  As of now threads are created dynamically
142*9e564957SAndroid Build Coastguard Worker 	 */
143*9e564957SAndroid Build Coastguard Worker 	unsigned int max_threads;
144*9e564957SAndroid Build Coastguard Worker };
145*9e564957SAndroid Build Coastguard Worker #endif
146*9e564957SAndroid Build Coastguard Worker 
147*9e564957SAndroid Build Coastguard Worker /* ----------------------------------------------------------- *
148*9e564957SAndroid Build Coastguard Worker  * Channel interface (when using -o clone_fd)		       *
149*9e564957SAndroid Build Coastguard Worker  * ----------------------------------------------------------- */
150*9e564957SAndroid Build Coastguard Worker 
151*9e564957SAndroid Build Coastguard Worker /**
152*9e564957SAndroid Build Coastguard Worker  * Obtain counted reference to the channel
153*9e564957SAndroid Build Coastguard Worker  *
154*9e564957SAndroid Build Coastguard Worker  * @param ch the channel
155*9e564957SAndroid Build Coastguard Worker  * @return the channel
156*9e564957SAndroid Build Coastguard Worker  */
157*9e564957SAndroid Build Coastguard Worker struct fuse_chan *fuse_chan_get(struct fuse_chan *ch);
158*9e564957SAndroid Build Coastguard Worker 
159*9e564957SAndroid Build Coastguard Worker /**
160*9e564957SAndroid Build Coastguard Worker  * Drop counted reference to a channel
161*9e564957SAndroid Build Coastguard Worker  *
162*9e564957SAndroid Build Coastguard Worker  * @param ch the channel
163*9e564957SAndroid Build Coastguard Worker  */
164*9e564957SAndroid Build Coastguard Worker void fuse_chan_put(struct fuse_chan *ch);
165*9e564957SAndroid Build Coastguard Worker 
166*9e564957SAndroid Build Coastguard Worker struct mount_opts *parse_mount_opts(struct fuse_args *args);
167*9e564957SAndroid Build Coastguard Worker void destroy_mount_opts(struct mount_opts *mo);
168*9e564957SAndroid Build Coastguard Worker void fuse_mount_version(void);
169*9e564957SAndroid Build Coastguard Worker unsigned get_max_read(struct mount_opts *o);
170*9e564957SAndroid Build Coastguard Worker void fuse_kern_unmount(const char *mountpoint, int fd);
171*9e564957SAndroid Build Coastguard Worker int fuse_kern_mount(const char *mountpoint, struct mount_opts *mo);
172*9e564957SAndroid Build Coastguard Worker 
173*9e564957SAndroid Build Coastguard Worker int fuse_send_reply_iov_nofree(fuse_req_t req, int error, struct iovec *iov,
174*9e564957SAndroid Build Coastguard Worker 			       int count);
175*9e564957SAndroid Build Coastguard Worker void fuse_free_req(fuse_req_t req);
176*9e564957SAndroid Build Coastguard Worker 
177*9e564957SAndroid Build Coastguard Worker void cuse_lowlevel_init(fuse_req_t req, fuse_ino_t nodeide, const void *inarg);
178*9e564957SAndroid Build Coastguard Worker 
179*9e564957SAndroid Build Coastguard Worker int fuse_start_thread(pthread_t *thread_id, void *(*func)(void *), void *arg);
180*9e564957SAndroid Build Coastguard Worker 
181*9e564957SAndroid Build Coastguard Worker int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf,
182*9e564957SAndroid Build Coastguard Worker 				 struct fuse_chan *ch);
183*9e564957SAndroid Build Coastguard Worker void fuse_session_process_buf_int(struct fuse_session *se,
184*9e564957SAndroid Build Coastguard Worker 				  const struct fuse_buf *buf, struct fuse_chan *ch);
185*9e564957SAndroid Build Coastguard Worker 
186*9e564957SAndroid Build Coastguard Worker struct fuse *fuse_new_31(struct fuse_args *args, const struct fuse_operations *op,
187*9e564957SAndroid Build Coastguard Worker 		      size_t op_size, void *private_data);
188*9e564957SAndroid Build Coastguard Worker int fuse_loop_mt_312(struct fuse *f, struct fuse_loop_config *config);
189*9e564957SAndroid Build Coastguard Worker int fuse_session_loop_mt_312(struct fuse_session *se, struct fuse_loop_config *config);
190*9e564957SAndroid Build Coastguard Worker 
191*9e564957SAndroid Build Coastguard Worker /**
192*9e564957SAndroid Build Coastguard Worker  * Internal verifier for the given config.
193*9e564957SAndroid Build Coastguard Worker  *
194*9e564957SAndroid Build Coastguard Worker  * @return negative standard error code or 0 on success
195*9e564957SAndroid Build Coastguard Worker  */
196*9e564957SAndroid Build Coastguard Worker int fuse_loop_cfg_verify(struct fuse_loop_config *config);
197*9e564957SAndroid Build Coastguard Worker 
198*9e564957SAndroid Build Coastguard Worker 
199*9e564957SAndroid Build Coastguard Worker #define FUSE_MAX_MAX_PAGES 256
200*9e564957SAndroid Build Coastguard Worker #define FUSE_DEFAULT_MAX_PAGES_PER_REQ 32
201*9e564957SAndroid Build Coastguard Worker 
202*9e564957SAndroid Build Coastguard Worker /* room needed in buffer to accommodate header */
203*9e564957SAndroid Build Coastguard Worker #define FUSE_BUFFER_HEADER_SIZE 0x1000
204*9e564957SAndroid Build Coastguard Worker 
205