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