cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fuse.h (24727B)


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