cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

fuse.h (22891B)


      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
    186#ifndef _LINUX_FUSE_H
    187#define _LINUX_FUSE_H
    188
    189#include <stdint.h>
    190
    191/*
    192 * Version negotiation:
    193 *
    194 * Both the kernel and userspace send the version they support in the
    195 * INIT request and reply respectively.
    196 *
    197 * If the major versions match then both shall use the smallest
    198 * of the two minor versions for communication.
    199 *
    200 * If the kernel supports a larger major version, then userspace shall
    201 * reply with the major version it supports, ignore the rest of the
    202 * INIT message and expect a new INIT message from the kernel with a
    203 * matching major version.
    204 *
    205 * If the library supports a larger major version, then it shall fall
    206 * back to the major protocol version sent by the kernel for
    207 * communication and reply with that major version (and an arbitrary
    208 * supported minor version).
    209 */
    210
    211/** Version number of this interface */
    212#define FUSE_KERNEL_VERSION 7
    213
    214/** Minor version number of this interface */
    215#define FUSE_KERNEL_MINOR_VERSION 33
    216
    217/** The node ID of the root inode */
    218#define FUSE_ROOT_ID 1
    219
    220/* Make sure all structures are padded to 64bit boundary, so 32bit
    221   userspace works under 64bit kernels */
    222
    223struct fuse_attr {
    224	uint64_t	ino;
    225	uint64_t	size;
    226	uint64_t	blocks;
    227	uint64_t	atime;
    228	uint64_t	mtime;
    229	uint64_t	ctime;
    230	uint32_t	atimensec;
    231	uint32_t	mtimensec;
    232	uint32_t	ctimensec;
    233	uint32_t	mode;
    234	uint32_t	nlink;
    235	uint32_t	uid;
    236	uint32_t	gid;
    237	uint32_t	rdev;
    238	uint32_t	blksize;
    239	uint32_t	flags;
    240};
    241
    242struct fuse_kstatfs {
    243	uint64_t	blocks;
    244	uint64_t	bfree;
    245	uint64_t	bavail;
    246	uint64_t	files;
    247	uint64_t	ffree;
    248	uint32_t	bsize;
    249	uint32_t	namelen;
    250	uint32_t	frsize;
    251	uint32_t	padding;
    252	uint32_t	spare[6];
    253};
    254
    255struct fuse_file_lock {
    256	uint64_t	start;
    257	uint64_t	end;
    258	uint32_t	type;
    259	uint32_t	pid; /* tgid */
    260};
    261
    262/**
    263 * Bitmasks for fuse_setattr_in.valid
    264 */
    265#define FATTR_MODE	(1 << 0)
    266#define FATTR_UID	(1 << 1)
    267#define FATTR_GID	(1 << 2)
    268#define FATTR_SIZE	(1 << 3)
    269#define FATTR_ATIME	(1 << 4)
    270#define FATTR_MTIME	(1 << 5)
    271#define FATTR_FH	(1 << 6)
    272#define FATTR_ATIME_NOW	(1 << 7)
    273#define FATTR_MTIME_NOW	(1 << 8)
    274#define FATTR_LOCKOWNER	(1 << 9)
    275#define FATTR_CTIME	(1 << 10)
    276#define FATTR_KILL_SUIDGID	(1 << 11)
    277
    278/**
    279 * Flags returned by the OPEN request
    280 *
    281 * FOPEN_DIRECT_IO: bypass page cache for this open file
    282 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
    283 * FOPEN_NONSEEKABLE: the file is not seekable
    284 * FOPEN_CACHE_DIR: allow caching this directory
    285 * FOPEN_STREAM: the file is stream-like (no file position at all)
    286 */
    287#define FOPEN_DIRECT_IO		(1 << 0)
    288#define FOPEN_KEEP_CACHE	(1 << 1)
    289#define FOPEN_NONSEEKABLE	(1 << 2)
    290#define FOPEN_CACHE_DIR		(1 << 3)
    291#define FOPEN_STREAM		(1 << 4)
    292
    293/**
    294 * INIT request/reply flags
    295 *
    296 * FUSE_ASYNC_READ: asynchronous read requests
    297 * FUSE_POSIX_LOCKS: remote locking for POSIX file locks
    298 * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported)
    299 * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem
    300 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
    301 * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB
    302 * FUSE_DONT_MASK: don't apply umask to file mode on create operations
    303 * FUSE_SPLICE_WRITE: kernel supports splice write on the device
    304 * FUSE_SPLICE_MOVE: kernel supports splice move on the device
    305 * FUSE_SPLICE_READ: kernel supports splice read on the device
    306 * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks
    307 * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories
    308 * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages
    309 * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one)
    310 * FUSE_READDIRPLUS_AUTO: adaptive readdirplus
    311 * FUSE_ASYNC_DIO: asynchronous direct I/O submission
    312 * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes
    313 * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens
    314 * FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir
    315 * FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc
    316 * FUSE_POSIX_ACL: filesystem supports posix acls
    317 * FUSE_ABORT_ERROR: reading the device after abort returns ECONNABORTED
    318 * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages
    319 * FUSE_CACHE_SYMLINKS: cache READLINK responses
    320 * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
    321 * FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request
    322 * FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for
    323 *		       foffset and moffset fields in struct
    324 *		       fuse_setupmapping_out and fuse_removemapping_one.
    325 * FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts
    326 * FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc.
    327 *			Upon write/truncate suid/sgid is only killed if caller
    328 *			does not have CAP_FSETID. Additionally upon
    329 *			write/truncate sgid is killed only if file has group
    330 *			execute permission. (Same as Linux VFS behavior).
    331 * FUSE_SETXATTR_EXT:	Server supports extended struct fuse_setxattr_in
    332 */
    333#define FUSE_ASYNC_READ		(1 << 0)
    334#define FUSE_POSIX_LOCKS	(1 << 1)
    335#define FUSE_FILE_OPS		(1 << 2)
    336#define FUSE_ATOMIC_O_TRUNC	(1 << 3)
    337#define FUSE_EXPORT_SUPPORT	(1 << 4)
    338#define FUSE_BIG_WRITES		(1 << 5)
    339#define FUSE_DONT_MASK		(1 << 6)
    340#define FUSE_SPLICE_WRITE	(1 << 7)
    341#define FUSE_SPLICE_MOVE	(1 << 8)
    342#define FUSE_SPLICE_READ	(1 << 9)
    343#define FUSE_FLOCK_LOCKS	(1 << 10)
    344#define FUSE_HAS_IOCTL_DIR	(1 << 11)
    345#define FUSE_AUTO_INVAL_DATA	(1 << 12)
    346#define FUSE_DO_READDIRPLUS	(1 << 13)
    347#define FUSE_READDIRPLUS_AUTO	(1 << 14)
    348#define FUSE_ASYNC_DIO		(1 << 15)
    349#define FUSE_WRITEBACK_CACHE	(1 << 16)
    350#define FUSE_NO_OPEN_SUPPORT	(1 << 17)
    351#define FUSE_PARALLEL_DIROPS    (1 << 18)
    352#define FUSE_HANDLE_KILLPRIV	(1 << 19)
    353#define FUSE_POSIX_ACL		(1 << 20)
    354#define FUSE_ABORT_ERROR	(1 << 21)
    355#define FUSE_MAX_PAGES		(1 << 22)
    356#define FUSE_CACHE_SYMLINKS	(1 << 23)
    357#define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
    358#define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
    359#define FUSE_MAP_ALIGNMENT	(1 << 26)
    360#define FUSE_SUBMOUNTS		(1 << 27)
    361#define FUSE_HANDLE_KILLPRIV_V2	(1 << 28)
    362#define FUSE_SETXATTR_EXT	(1 << 29)
    363
    364/**
    365 * CUSE INIT request/reply flags
    366 *
    367 * CUSE_UNRESTRICTED_IOCTL:  use unrestricted ioctl
    368 */
    369#define CUSE_UNRESTRICTED_IOCTL	(1 << 0)
    370
    371/**
    372 * Release flags
    373 */
    374#define FUSE_RELEASE_FLUSH	(1 << 0)
    375#define FUSE_RELEASE_FLOCK_UNLOCK	(1 << 1)
    376
    377/**
    378 * Getattr flags
    379 */
    380#define FUSE_GETATTR_FH		(1 << 0)
    381
    382/**
    383 * Lock flags
    384 */
    385#define FUSE_LK_FLOCK		(1 << 0)
    386
    387/**
    388 * WRITE flags
    389 *
    390 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
    391 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
    392 * FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits
    393 */
    394#define FUSE_WRITE_CACHE	(1 << 0)
    395#define FUSE_WRITE_LOCKOWNER	(1 << 1)
    396#define FUSE_WRITE_KILL_SUIDGID (1 << 2)
    397
    398/* Obsolete alias; this flag implies killing suid/sgid only. */
    399#define FUSE_WRITE_KILL_PRIV	FUSE_WRITE_KILL_SUIDGID
    400
    401/**
    402 * Read flags
    403 */
    404#define FUSE_READ_LOCKOWNER	(1 << 1)
    405
    406/**
    407 * Ioctl flags
    408 *
    409 * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
    410 * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
    411 * FUSE_IOCTL_RETRY: retry with new iovecs
    412 * FUSE_IOCTL_32BIT: 32bit ioctl
    413 * FUSE_IOCTL_DIR: is a directory
    414 * FUSE_IOCTL_COMPAT_X32: x32 compat ioctl on 64bit machine (64bit time_t)
    415 *
    416 * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
    417 */
    418#define FUSE_IOCTL_COMPAT	(1 << 0)
    419#define FUSE_IOCTL_UNRESTRICTED	(1 << 1)
    420#define FUSE_IOCTL_RETRY	(1 << 2)
    421#define FUSE_IOCTL_32BIT	(1 << 3)
    422#define FUSE_IOCTL_DIR		(1 << 4)
    423#define FUSE_IOCTL_COMPAT_X32	(1 << 5)
    424
    425#define FUSE_IOCTL_MAX_IOV	256
    426
    427/**
    428 * Poll flags
    429 *
    430 * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify
    431 */
    432#define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
    433
    434/**
    435 * Fsync flags
    436 *
    437 * FUSE_FSYNC_FDATASYNC: Sync data only, not metadata
    438 */
    439#define FUSE_FSYNC_FDATASYNC	(1 << 0)
    440
    441/**
    442 * fuse_attr flags
    443 *
    444 * FUSE_ATTR_SUBMOUNT: Object is a submount root
    445 */
    446#define FUSE_ATTR_SUBMOUNT      (1 << 0)
    447
    448/**
    449 * Open flags
    450 * FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable
    451 */
    452#define FUSE_OPEN_KILL_SUIDGID	(1 << 0)
    453
    454/**
    455 * setxattr flags
    456 * FUSE_SETXATTR_ACL_KILL_SGID: Clear SGID when system.posix_acl_access is set
    457 */
    458#define FUSE_SETXATTR_ACL_KILL_SGID	(1 << 0)
    459
    460enum fuse_opcode {
    461	FUSE_LOOKUP		= 1,
    462	FUSE_FORGET		= 2,  /* no reply */
    463	FUSE_GETATTR		= 3,
    464	FUSE_SETATTR		= 4,
    465	FUSE_READLINK		= 5,
    466	FUSE_SYMLINK		= 6,
    467	FUSE_MKNOD		= 8,
    468	FUSE_MKDIR		= 9,
    469	FUSE_UNLINK		= 10,
    470	FUSE_RMDIR		= 11,
    471	FUSE_RENAME		= 12,
    472	FUSE_LINK		= 13,
    473	FUSE_OPEN		= 14,
    474	FUSE_READ		= 15,
    475	FUSE_WRITE		= 16,
    476	FUSE_STATFS		= 17,
    477	FUSE_RELEASE		= 18,
    478	FUSE_FSYNC		= 20,
    479	FUSE_SETXATTR		= 21,
    480	FUSE_GETXATTR		= 22,
    481	FUSE_LISTXATTR		= 23,
    482	FUSE_REMOVEXATTR	= 24,
    483	FUSE_FLUSH		= 25,
    484	FUSE_INIT		= 26,
    485	FUSE_OPENDIR		= 27,
    486	FUSE_READDIR		= 28,
    487	FUSE_RELEASEDIR		= 29,
    488	FUSE_FSYNCDIR		= 30,
    489	FUSE_GETLK		= 31,
    490	FUSE_SETLK		= 32,
    491	FUSE_SETLKW		= 33,
    492	FUSE_ACCESS		= 34,
    493	FUSE_CREATE		= 35,
    494	FUSE_INTERRUPT		= 36,
    495	FUSE_BMAP		= 37,
    496	FUSE_DESTROY		= 38,
    497	FUSE_IOCTL		= 39,
    498	FUSE_POLL		= 40,
    499	FUSE_NOTIFY_REPLY	= 41,
    500	FUSE_BATCH_FORGET	= 42,
    501	FUSE_FALLOCATE		= 43,
    502	FUSE_READDIRPLUS	= 44,
    503	FUSE_RENAME2		= 45,
    504	FUSE_LSEEK		= 46,
    505	FUSE_COPY_FILE_RANGE	= 47,
    506	FUSE_SETUPMAPPING	= 48,
    507	FUSE_REMOVEMAPPING	= 49,
    508
    509	/* CUSE specific operations */
    510	CUSE_INIT		= 4096,
    511
    512	/* Reserved opcodes: helpful to detect structure endian-ness */
    513	CUSE_INIT_BSWAP_RESERVED	= 1048576,	/* CUSE_INIT << 8 */
    514	FUSE_INIT_BSWAP_RESERVED	= 436207616,	/* FUSE_INIT << 24 */
    515};
    516
    517enum fuse_notify_code {
    518	FUSE_NOTIFY_POLL   = 1,
    519	FUSE_NOTIFY_INVAL_INODE = 2,
    520	FUSE_NOTIFY_INVAL_ENTRY = 3,
    521	FUSE_NOTIFY_STORE = 4,
    522	FUSE_NOTIFY_RETRIEVE = 5,
    523	FUSE_NOTIFY_DELETE = 6,
    524	FUSE_NOTIFY_CODE_MAX,
    525};
    526
    527/* The read buffer is required to be at least 8k, but may be much larger */
    528#define FUSE_MIN_READ_BUFFER 8192
    529
    530#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
    531
    532struct fuse_entry_out {
    533	uint64_t	nodeid;		/* Inode ID */
    534	uint64_t	generation;	/* Inode generation: nodeid:gen must
    535					   be unique for the fs's lifetime */
    536	uint64_t	entry_valid;	/* Cache timeout for the name */
    537	uint64_t	attr_valid;	/* Cache timeout for the attributes */
    538	uint32_t	entry_valid_nsec;
    539	uint32_t	attr_valid_nsec;
    540	struct fuse_attr attr;
    541};
    542
    543struct fuse_forget_in {
    544	uint64_t	nlookup;
    545};
    546
    547struct fuse_forget_one {
    548	uint64_t	nodeid;
    549	uint64_t	nlookup;
    550};
    551
    552struct fuse_batch_forget_in {
    553	uint32_t	count;
    554	uint32_t	dummy;
    555};
    556
    557struct fuse_getattr_in {
    558	uint32_t	getattr_flags;
    559	uint32_t	dummy;
    560	uint64_t	fh;
    561};
    562
    563#define FUSE_COMPAT_ATTR_OUT_SIZE 96
    564
    565struct fuse_attr_out {
    566	uint64_t	attr_valid;	/* Cache timeout for the attributes */
    567	uint32_t	attr_valid_nsec;
    568	uint32_t	dummy;
    569	struct fuse_attr attr;
    570};
    571
    572#define FUSE_COMPAT_MKNOD_IN_SIZE 8
    573
    574struct fuse_mknod_in {
    575	uint32_t	mode;
    576	uint32_t	rdev;
    577	uint32_t	umask;
    578	uint32_t	padding;
    579};
    580
    581struct fuse_mkdir_in {
    582	uint32_t	mode;
    583	uint32_t	umask;
    584};
    585
    586struct fuse_rename_in {
    587	uint64_t	newdir;
    588};
    589
    590struct fuse_rename2_in {
    591	uint64_t	newdir;
    592	uint32_t	flags;
    593	uint32_t	padding;
    594};
    595
    596struct fuse_link_in {
    597	uint64_t	oldnodeid;
    598};
    599
    600struct fuse_setattr_in {
    601	uint32_t	valid;
    602	uint32_t	padding;
    603	uint64_t	fh;
    604	uint64_t	size;
    605	uint64_t	lock_owner;
    606	uint64_t	atime;
    607	uint64_t	mtime;
    608	uint64_t	ctime;
    609	uint32_t	atimensec;
    610	uint32_t	mtimensec;
    611	uint32_t	ctimensec;
    612	uint32_t	mode;
    613	uint32_t	unused4;
    614	uint32_t	uid;
    615	uint32_t	gid;
    616	uint32_t	unused5;
    617};
    618
    619struct fuse_open_in {
    620	uint32_t	flags;
    621	uint32_t	open_flags;	/* FUSE_OPEN_... */
    622};
    623
    624struct fuse_create_in {
    625	uint32_t	flags;
    626	uint32_t	mode;
    627	uint32_t	umask;
    628	uint32_t	open_flags;	/* FUSE_OPEN_... */
    629};
    630
    631struct fuse_open_out {
    632	uint64_t	fh;
    633	uint32_t	open_flags;
    634	uint32_t	padding;
    635};
    636
    637struct fuse_release_in {
    638	uint64_t	fh;
    639	uint32_t	flags;
    640	uint32_t	release_flags;
    641	uint64_t	lock_owner;
    642};
    643
    644struct fuse_flush_in {
    645	uint64_t	fh;
    646	uint32_t	unused;
    647	uint32_t	padding;
    648	uint64_t	lock_owner;
    649};
    650
    651struct fuse_read_in {
    652	uint64_t	fh;
    653	uint64_t	offset;
    654	uint32_t	size;
    655	uint32_t	read_flags;
    656	uint64_t	lock_owner;
    657	uint32_t	flags;
    658	uint32_t	padding;
    659};
    660
    661#define FUSE_COMPAT_WRITE_IN_SIZE 24
    662
    663struct fuse_write_in {
    664	uint64_t	fh;
    665	uint64_t	offset;
    666	uint32_t	size;
    667	uint32_t	write_flags;
    668	uint64_t	lock_owner;
    669	uint32_t	flags;
    670	uint32_t	padding;
    671};
    672
    673struct fuse_write_out {
    674	uint32_t	size;
    675	uint32_t	padding;
    676};
    677
    678#define FUSE_COMPAT_STATFS_SIZE 48
    679
    680struct fuse_statfs_out {
    681	struct fuse_kstatfs st;
    682};
    683
    684struct fuse_fsync_in {
    685	uint64_t	fh;
    686	uint32_t	fsync_flags;
    687	uint32_t	padding;
    688};
    689
    690#define FUSE_COMPAT_SETXATTR_IN_SIZE 8
    691
    692struct fuse_setxattr_in {
    693	uint32_t	size;
    694	uint32_t	flags;
    695	uint32_t	setxattr_flags;
    696	uint32_t	padding;
    697};
    698
    699struct fuse_getxattr_in {
    700	uint32_t	size;
    701	uint32_t	padding;
    702};
    703
    704struct fuse_getxattr_out {
    705	uint32_t	size;
    706	uint32_t	padding;
    707};
    708
    709struct fuse_lk_in {
    710	uint64_t	fh;
    711	uint64_t	owner;
    712	struct fuse_file_lock lk;
    713	uint32_t	lk_flags;
    714	uint32_t	padding;
    715};
    716
    717struct fuse_lk_out {
    718	struct fuse_file_lock lk;
    719};
    720
    721struct fuse_access_in {
    722	uint32_t	mask;
    723	uint32_t	padding;
    724};
    725
    726struct fuse_init_in {
    727	uint32_t	major;
    728	uint32_t	minor;
    729	uint32_t	max_readahead;
    730	uint32_t	flags;
    731};
    732
    733#define FUSE_COMPAT_INIT_OUT_SIZE 8
    734#define FUSE_COMPAT_22_INIT_OUT_SIZE 24
    735
    736struct fuse_init_out {
    737	uint32_t	major;
    738	uint32_t	minor;
    739	uint32_t	max_readahead;
    740	uint32_t	flags;
    741	uint16_t	max_background;
    742	uint16_t	congestion_threshold;
    743	uint32_t	max_write;
    744	uint32_t	time_gran;
    745	uint16_t	max_pages;
    746	uint16_t	map_alignment;
    747	uint32_t	unused[8];
    748};
    749
    750#define CUSE_INIT_INFO_MAX 4096
    751
    752struct cuse_init_in {
    753	uint32_t	major;
    754	uint32_t	minor;
    755	uint32_t	unused;
    756	uint32_t	flags;
    757};
    758
    759struct cuse_init_out {
    760	uint32_t	major;
    761	uint32_t	minor;
    762	uint32_t	unused;
    763	uint32_t	flags;
    764	uint32_t	max_read;
    765	uint32_t	max_write;
    766	uint32_t	dev_major;		/* chardev major */
    767	uint32_t	dev_minor;		/* chardev minor */
    768	uint32_t	spare[10];
    769};
    770
    771struct fuse_interrupt_in {
    772	uint64_t	unique;
    773};
    774
    775struct fuse_bmap_in {
    776	uint64_t	block;
    777	uint32_t	blocksize;
    778	uint32_t	padding;
    779};
    780
    781struct fuse_bmap_out {
    782	uint64_t	block;
    783};
    784
    785struct fuse_ioctl_in {
    786	uint64_t	fh;
    787	uint32_t	flags;
    788	uint32_t	cmd;
    789	uint64_t	arg;
    790	uint32_t	in_size;
    791	uint32_t	out_size;
    792};
    793
    794struct fuse_ioctl_iovec {
    795	uint64_t	base;
    796	uint64_t	len;
    797};
    798
    799struct fuse_ioctl_out {
    800	int32_t		result;
    801	uint32_t	flags;
    802	uint32_t	in_iovs;
    803	uint32_t	out_iovs;
    804};
    805
    806struct fuse_poll_in {
    807	uint64_t	fh;
    808	uint64_t	kh;
    809	uint32_t	flags;
    810	uint32_t	events;
    811};
    812
    813struct fuse_poll_out {
    814	uint32_t	revents;
    815	uint32_t	padding;
    816};
    817
    818struct fuse_notify_poll_wakeup_out {
    819	uint64_t	kh;
    820};
    821
    822struct fuse_fallocate_in {
    823	uint64_t	fh;
    824	uint64_t	offset;
    825	uint64_t	length;
    826	uint32_t	mode;
    827	uint32_t	padding;
    828};
    829
    830struct fuse_in_header {
    831	uint32_t	len;
    832	uint32_t	opcode;
    833	uint64_t	unique;
    834	uint64_t	nodeid;
    835	uint32_t	uid;
    836	uint32_t	gid;
    837	uint32_t	pid;
    838	uint32_t	padding;
    839};
    840
    841struct fuse_out_header {
    842	uint32_t	len;
    843	int32_t		error;
    844	uint64_t	unique;
    845};
    846
    847struct fuse_dirent {
    848	uint64_t	ino;
    849	uint64_t	off;
    850	uint32_t	namelen;
    851	uint32_t	type;
    852	char name[];
    853};
    854
    855#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
    856#define FUSE_DIRENT_ALIGN(x) \
    857	(((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
    858#define FUSE_DIRENT_SIZE(d) \
    859	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
    860
    861struct fuse_direntplus {
    862	struct fuse_entry_out entry_out;
    863	struct fuse_dirent dirent;
    864};
    865
    866#define FUSE_NAME_OFFSET_DIRENTPLUS \
    867	offsetof(struct fuse_direntplus, dirent.name)
    868#define FUSE_DIRENTPLUS_SIZE(d) \
    869	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
    870
    871struct fuse_notify_inval_inode_out {
    872	uint64_t	ino;
    873	int64_t		off;
    874	int64_t		len;
    875};
    876
    877struct fuse_notify_inval_entry_out {
    878	uint64_t	parent;
    879	uint32_t	namelen;
    880	uint32_t	padding;
    881};
    882
    883struct fuse_notify_delete_out {
    884	uint64_t	parent;
    885	uint64_t	child;
    886	uint32_t	namelen;
    887	uint32_t	padding;
    888};
    889
    890struct fuse_notify_store_out {
    891	uint64_t	nodeid;
    892	uint64_t	offset;
    893	uint32_t	size;
    894	uint32_t	padding;
    895};
    896
    897struct fuse_notify_retrieve_out {
    898	uint64_t	notify_unique;
    899	uint64_t	nodeid;
    900	uint64_t	offset;
    901	uint32_t	size;
    902	uint32_t	padding;
    903};
    904
    905/* Matches the size of fuse_write_in */
    906struct fuse_notify_retrieve_in {
    907	uint64_t	dummy1;
    908	uint64_t	offset;
    909	uint32_t	size;
    910	uint32_t	dummy2;
    911	uint64_t	dummy3;
    912	uint64_t	dummy4;
    913};
    914
    915/* Device ioctls: */
    916#define FUSE_DEV_IOC_MAGIC		229
    917#define FUSE_DEV_IOC_CLONE		_IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
    918
    919struct fuse_lseek_in {
    920	uint64_t	fh;
    921	uint64_t	offset;
    922	uint32_t	whence;
    923	uint32_t	padding;
    924};
    925
    926struct fuse_lseek_out {
    927	uint64_t	offset;
    928};
    929
    930struct fuse_copy_file_range_in {
    931	uint64_t	fh_in;
    932	uint64_t	off_in;
    933	uint64_t	nodeid_out;
    934	uint64_t	fh_out;
    935	uint64_t	off_out;
    936	uint64_t	len;
    937	uint64_t	flags;
    938};
    939
    940#define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
    941#define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
    942struct fuse_setupmapping_in {
    943	/* An already open handle */
    944	uint64_t	fh;
    945	/* Offset into the file to start the mapping */
    946	uint64_t	foffset;
    947	/* Length of mapping required */
    948	uint64_t	len;
    949	/* Flags, FUSE_SETUPMAPPING_FLAG_* */
    950	uint64_t	flags;
    951	/* Offset in Memory Window */
    952	uint64_t	moffset;
    953};
    954
    955struct fuse_removemapping_in {
    956	/* number of fuse_removemapping_one follows */
    957	uint32_t        count;
    958};
    959
    960struct fuse_removemapping_one {
    961	/* Offset into the dax window start the unmapping */
    962	uint64_t        moffset;
    963	/* Length of mapping required */
    964	uint64_t	len;
    965};
    966
    967#define FUSE_REMOVEMAPPING_MAX_ENTRY   \
    968		(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
    969
    970#endif /* _LINUX_FUSE_H */