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