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