1e2be04c7SGreg Kroah-Hartman /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */ 2607ca46eSDavid Howells /* 37e98d530SMiklos Szeredi This file defines the kernel interface of FUSE 4607ca46eSDavid Howells Copyright (C) 2001-2008 Miklos Szeredi <[email protected]> 5607ca46eSDavid Howells 6607ca46eSDavid Howells This program can be distributed under the terms of the GNU GPL. 7607ca46eSDavid Howells See the file COPYING. 87e98d530SMiklos Szeredi 97e98d530SMiklos Szeredi This -- and only this -- header file may also be distributed under 107e98d530SMiklos Szeredi the terms of the BSD Licence as follows: 117e98d530SMiklos Szeredi 127e98d530SMiklos Szeredi Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. 137e98d530SMiklos Szeredi 147e98d530SMiklos Szeredi Redistribution and use in source and binary forms, with or without 157e98d530SMiklos Szeredi modification, are permitted provided that the following conditions 167e98d530SMiklos Szeredi are met: 177e98d530SMiklos Szeredi 1. Redistributions of source code must retain the above copyright 187e98d530SMiklos Szeredi notice, this list of conditions and the following disclaimer. 197e98d530SMiklos Szeredi 2. Redistributions in binary form must reproduce the above copyright 207e98d530SMiklos Szeredi notice, this list of conditions and the following disclaimer in the 217e98d530SMiklos Szeredi documentation and/or other materials provided with the distribution. 227e98d530SMiklos Szeredi 237e98d530SMiklos Szeredi THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 247e98d530SMiklos Szeredi ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 257e98d530SMiklos Szeredi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 267e98d530SMiklos Szeredi ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 277e98d530SMiklos Szeredi FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 287e98d530SMiklos Szeredi DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 297e98d530SMiklos Szeredi OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 307e98d530SMiklos Szeredi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 317e98d530SMiklos Szeredi LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 327e98d530SMiklos Szeredi OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 337e98d530SMiklos Szeredi SUCH DAMAGE. 34607ca46eSDavid Howells */ 35607ca46eSDavid Howells 36607ca46eSDavid Howells /* 37607ca46eSDavid Howells * This file defines the kernel interface of FUSE 38607ca46eSDavid Howells * 39607ca46eSDavid Howells * Protocol changelog: 40607ca46eSDavid Howells * 419de55a37SAlan Somers * 7.1: 429de55a37SAlan Somers * - add the following messages: 439de55a37SAlan Somers * FUSE_SETATTR, FUSE_SYMLINK, FUSE_MKNOD, FUSE_MKDIR, FUSE_UNLINK, 449de55a37SAlan Somers * FUSE_RMDIR, FUSE_RENAME, FUSE_LINK, FUSE_OPEN, FUSE_READ, FUSE_WRITE, 459de55a37SAlan Somers * FUSE_RELEASE, FUSE_FSYNC, FUSE_FLUSH, FUSE_SETXATTR, FUSE_GETXATTR, 469de55a37SAlan Somers * FUSE_LISTXATTR, FUSE_REMOVEXATTR, FUSE_OPENDIR, FUSE_READDIR, 479de55a37SAlan Somers * FUSE_RELEASEDIR 489de55a37SAlan Somers * - add padding to messages to accommodate 32-bit servers on 64-bit kernels 499de55a37SAlan Somers * 509de55a37SAlan Somers * 7.2: 519de55a37SAlan Somers * - add FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE flags 529de55a37SAlan Somers * - add FUSE_FSYNCDIR message 539de55a37SAlan Somers * 549de55a37SAlan Somers * 7.3: 559de55a37SAlan Somers * - add FUSE_ACCESS message 569de55a37SAlan Somers * - add FUSE_CREATE message 579de55a37SAlan Somers * - add filehandle to fuse_setattr_in 589de55a37SAlan Somers * 599de55a37SAlan Somers * 7.4: 609de55a37SAlan Somers * - add frsize to fuse_kstatfs 619de55a37SAlan Somers * - clean up request size limit checking 629de55a37SAlan Somers * 639de55a37SAlan Somers * 7.5: 649de55a37SAlan Somers * - add flags and max_write to fuse_init_out 659de55a37SAlan Somers * 669de55a37SAlan Somers * 7.6: 679de55a37SAlan Somers * - add max_readahead to fuse_init_in and fuse_init_out 689de55a37SAlan Somers * 699de55a37SAlan Somers * 7.7: 709de55a37SAlan Somers * - add FUSE_INTERRUPT message 719de55a37SAlan Somers * - add POSIX file lock support 729de55a37SAlan Somers * 739de55a37SAlan Somers * 7.8: 749de55a37SAlan Somers * - add lock_owner and flags fields to fuse_release_in 759de55a37SAlan Somers * - add FUSE_BMAP message 769de55a37SAlan Somers * - add FUSE_DESTROY message 779de55a37SAlan Somers * 78607ca46eSDavid Howells * 7.9: 79607ca46eSDavid Howells * - new fuse_getattr_in input argument of GETATTR 80607ca46eSDavid Howells * - add lk_flags in fuse_lk_in 81607ca46eSDavid Howells * - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in 82607ca46eSDavid Howells * - add blksize field to fuse_attr 83607ca46eSDavid Howells * - add file flags field to fuse_read_in and fuse_write_in 847142fd1bSAlan Somers * - Add ATIME_NOW and MTIME_NOW flags to fuse_setattr_in 85607ca46eSDavid Howells * 86607ca46eSDavid Howells * 7.10 87607ca46eSDavid Howells * - add nonseekable open flag 88607ca46eSDavid Howells * 89607ca46eSDavid Howells * 7.11 90607ca46eSDavid Howells * - add IOCTL message 91607ca46eSDavid Howells * - add unsolicited notification support 92607ca46eSDavid Howells * - add POLL message and NOTIFY_POLL notification 93607ca46eSDavid Howells * 94607ca46eSDavid Howells * 7.12 9568065b84SAlan Somers * - add umask flag to input argument of create, mknod and mkdir 96607ca46eSDavid Howells * - add notification messages for invalidation of inodes and 97607ca46eSDavid Howells * directory entries 98607ca46eSDavid Howells * 99607ca46eSDavid Howells * 7.13 100607ca46eSDavid Howells * - make max number of background requests and congestion threshold 101607ca46eSDavid Howells * tunables 102607ca46eSDavid Howells * 103607ca46eSDavid Howells * 7.14 104607ca46eSDavid Howells * - add splice support to fuse device 105607ca46eSDavid Howells * 106607ca46eSDavid Howells * 7.15 107607ca46eSDavid Howells * - add store notify 108607ca46eSDavid Howells * - add retrieve notify 109607ca46eSDavid Howells * 110607ca46eSDavid Howells * 7.16 111607ca46eSDavid Howells * - add BATCH_FORGET request 112607ca46eSDavid Howells * - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct 113607ca46eSDavid Howells * fuse_ioctl_iovec' instead of ambiguous 'struct iovec' 114607ca46eSDavid Howells * - add FUSE_IOCTL_32BIT flag 115607ca46eSDavid Howells * 116607ca46eSDavid Howells * 7.17 117607ca46eSDavid Howells * - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK 118607ca46eSDavid Howells * 119607ca46eSDavid Howells * 7.18 120607ca46eSDavid Howells * - add FUSE_IOCTL_DIR flag 121607ca46eSDavid Howells * - add FUSE_NOTIFY_DELETE 122607ca46eSDavid Howells * 123607ca46eSDavid Howells * 7.19 124607ca46eSDavid Howells * - add FUSE_FALLOCATE 125607ca46eSDavid Howells * 126607ca46eSDavid Howells * 7.20 127607ca46eSDavid Howells * - add FUSE_AUTO_INVAL_DATA 12823c153e5SMiklos Szeredi * 12923c153e5SMiklos Szeredi * 7.21 13023c153e5SMiklos Szeredi * - add FUSE_READDIRPLUS 1310415d291SEnke Chen * - send the requested events in POLL request 13260b9df7aSMiklos Szeredi * 13360b9df7aSMiklos Szeredi * 7.22 13460b9df7aSMiklos Szeredi * - add FUSE_ASYNC_DIO 1354d99ff8fSPavel Emelyanov * 1364d99ff8fSPavel Emelyanov * 7.23 1374d99ff8fSPavel Emelyanov * - add FUSE_WRITEBACK_CACHE 138e27c9d38SMiklos Szeredi * - add time_gran to fuse_init_out 139e27c9d38SMiklos Szeredi * - add reserved space to fuse_init_out 140ab9e13f7SMaxim Patlasov * - add FATTR_CTIME 141ab9e13f7SMaxim Patlasov * - add ctime and ctimensec to fuse_setattr_in 1421560c974SMiklos Szeredi * - add FUSE_RENAME2 request 143d7afaec0SAndrew Gallagher * - add FUSE_NO_OPEN_SUPPORT flag 1440b5da8dbSRavishankar N * 1450b5da8dbSRavishankar N * 7.24 1460b5da8dbSRavishankar N * - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support 1475c672ab3SMiklos Szeredi * 1485c672ab3SMiklos Szeredi * 7.25 1495c672ab3SMiklos Szeredi * - add FUSE_PARALLEL_DIROPS 1505e940c1dSMiklos Szeredi * 1515e940c1dSMiklos Szeredi * 7.26 1525e940c1dSMiklos Szeredi * - add FUSE_HANDLE_KILLPRIV 15360bcc88aSSeth Forshee * - add FUSE_POSIX_ACL 1543b7008b2SSzymon Lukasz * 1553b7008b2SSzymon Lukasz * 7.27 1563b7008b2SSzymon Lukasz * - add FUSE_ABORT_ERROR 15788bc7d50SNiels de Vos * 15888bc7d50SNiels de Vos * 7.28 15988bc7d50SNiels de Vos * - add FUSE_COPY_FILE_RANGE 1606433b899SMiklos Szeredi * - add FOPEN_CACHE_DIR 1615da784ccSConstantine Shulyupin * - add FUSE_MAX_PAGES, add max_pages to init_out 1625571f1e6SDan Schatzberg * - add FUSE_CACHE_SYMLINKS 163d9a9ea94SChad Austin * 164d9a9ea94SChad Austin * 7.29 165d9a9ea94SChad Austin * - add FUSE_NO_OPENDIR_SUPPORT flag 166ad2ba64dSKirill Smelkov * 167ad2ba64dSKirill Smelkov * 7.30 168ad2ba64dSKirill Smelkov * - add FUSE_EXPLICIT_INVAL_DATA 1696407f44aSIan Abbott * - add FUSE_IOCTL_COMPAT_X32 1704a2abf99SMiklos Szeredi * 1714a2abf99SMiklos Szeredi * 7.31 1724a2abf99SMiklos Szeredi * - add FUSE_WRITE_KILL_PRIV flag 173c4bb667eSDr. David Alan Gilbert * - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING 174c4bb667eSDr. David Alan Gilbert * - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag 175c6ff213fSMax Reitz * 176c6ff213fSMax Reitz * 7.32 177c6ff213fSMax Reitz * - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS 17863f9909fSVivek Goyal * 17963f9909fSVivek Goyal * 7.33 18031792161SVivek Goyal * - add FUSE_HANDLE_KILLPRIV_V2, FUSE_WRITE_KILL_SUIDGID, FATTR_KILL_SUIDGID 181643a666aSVivek Goyal * - add FUSE_OPEN_KILL_SUIDGID 18252a4c95fSVivek Goyal * - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT 183550a7d3bSVivek Goyal * - add FUSE_SETXATTR_ACL_KILL_SGID 1842d82ab25SGreg Kurz * 1852d82ab25SGreg Kurz * 7.34 1862d82ab25SGreg Kurz * - add FUSE_SYNCFS 187a390ccb3SAmir Goldstein * 188a390ccb3SAmir Goldstein * 7.35 189a390ccb3SAmir Goldstein * - add FOPEN_NOFLUSH 19053db2893SMiklos Szeredi * 19153db2893SMiklos Szeredi * 7.36 19253db2893SMiklos Szeredi * - extend fuse_init_in with reserved fields, add FUSE_INIT_EXT init flag 19353db2893SMiklos Szeredi * - add flags2 to fuse_init_in and fuse_init_out 1943e2b6fdbSVivek Goyal * - add FUSE_SECURITY_CTX init flag 1953e2b6fdbSVivek Goyal * - add security context to create, mkdir, symlink, and mknod requests 19698046f74SJeffle Xu * - add FUSE_HAS_INODE_DAX, FUSE_ATTR_DAX 1977d375390SMiklos Szeredi * 1987d375390SMiklos Szeredi * 7.37 1997d375390SMiklos Szeredi * - add FUSE_TMPFILE 2004f8d3702SMiklos Szeredi * 2014f8d3702SMiklos Szeredi * 7.38 2024f8d3702SMiklos Szeredi * - add FUSE_EXPIRE_ONLY flag to fuse_notify_inval_entry 20315352405SDharmendra Singh * - add FOPEN_PARALLEL_DIRECT_WRITES 20415d937d7SMiklos Szeredi * - add total_extlen to fuse_in_header 20515d937d7SMiklos Szeredi * - add FUSE_MAX_NR_SECCTX 20615d937d7SMiklos Szeredi * - add extension header 2078ed7cb3fSMiklos Szeredi * - add FUSE_EXT_GROUPS 2088ed7cb3fSMiklos Szeredi * - add FUSE_CREATE_SUPP_GROUP 2095cadfbd5SMiklos Szeredi * - add FUSE_HAS_EXPIRE_ONLY 210e78662e8SHao Xu * 211e78662e8SHao Xu * 7.39 212c55e0a55STyler Fanelli * - add FUSE_DIRECT_IO_ALLOW_MMAP 213ba58a37cSMiklos Szeredi * - add FUSE_STATX and related structures 2147dc4e97aSAmir Goldstein * 2157dc4e97aSAmir Goldstein * 7.40 2167dc4e97aSAmir Goldstein * - add max_stack_depth to fuse_init_out, add FUSE_PASSTHROUGH init flag 2177dc4e97aSAmir Goldstein * - add backing_id to fuse_open_out, add FOPEN_PASSTHROUGH open flag 218e022f6a1SJingbo Xu * - add FUSE_NO_EXPORT_SUPPORT init flag 2199e7f5296SZhao Chen * - add FUSE_NOTIFY_RESEND, add FUSE_HAS_RESEND init flag 22016e1503eSAlexander Mikhalitsyn * 22116e1503eSAlexander Mikhalitsyn * 7.41 22216e1503eSAlexander Mikhalitsyn * - add FUSE_ALLOW_IDMAP 22324fe962cSBernd Schubert * 7.42 22424fe962cSBernd Schubert * - Add FUSE_OVER_IO_URING and all other io-uring related flags and data 22524fe962cSBernd Schubert * structures: 22624fe962cSBernd Schubert * - struct fuse_uring_ent_in_out 22724fe962cSBernd Schubert * - struct fuse_uring_req_header 22824fe962cSBernd Schubert * - struct fuse_uring_cmd_req 22924fe962cSBernd Schubert * - FUSE_URING_IN_OUT_HEADER_SZ 23024fe962cSBernd Schubert * - FUSE_URING_OP_IN_OUT_SZ 23124fe962cSBernd Schubert * - enum fuse_uring_cmd 232*0f6439f6SJoanne Koong * 233*0f6439f6SJoanne Koong * 7.43 234*0f6439f6SJoanne Koong * - add FUSE_REQUEST_TIMEOUT 235607ca46eSDavid Howells */ 236607ca46eSDavid Howells 237607ca46eSDavid Howells #ifndef _LINUX_FUSE_H 238607ca46eSDavid Howells #define _LINUX_FUSE_H 239607ca46eSDavid Howells 2404c82456eSMiklos Szeredi #ifdef __KERNEL__ 241607ca46eSDavid Howells #include <linux/types.h> 2427e98d530SMiklos Szeredi #else 2437e98d530SMiklos Szeredi #include <stdint.h> 2447e98d530SMiklos Szeredi #endif 245607ca46eSDavid Howells 246607ca46eSDavid Howells /* 247607ca46eSDavid Howells * Version negotiation: 248607ca46eSDavid Howells * 249607ca46eSDavid Howells * Both the kernel and userspace send the version they support in the 250607ca46eSDavid Howells * INIT request and reply respectively. 251607ca46eSDavid Howells * 252607ca46eSDavid Howells * If the major versions match then both shall use the smallest 253607ca46eSDavid Howells * of the two minor versions for communication. 254607ca46eSDavid Howells * 255607ca46eSDavid Howells * If the kernel supports a larger major version, then userspace shall 256607ca46eSDavid Howells * reply with the major version it supports, ignore the rest of the 257607ca46eSDavid Howells * INIT message and expect a new INIT message from the kernel with a 258607ca46eSDavid Howells * matching major version. 259607ca46eSDavid Howells * 260607ca46eSDavid Howells * If the library supports a larger major version, then it shall fall 261607ca46eSDavid Howells * back to the major protocol version sent by the kernel for 262607ca46eSDavid Howells * communication and reply with that major version (and an arbitrary 263607ca46eSDavid Howells * supported minor version). 264607ca46eSDavid Howells */ 265607ca46eSDavid Howells 266607ca46eSDavid Howells /** Version number of this interface */ 267607ca46eSDavid Howells #define FUSE_KERNEL_VERSION 7 268607ca46eSDavid Howells 269607ca46eSDavid Howells /** Minor version number of this interface */ 270*0f6439f6SJoanne Koong #define FUSE_KERNEL_MINOR_VERSION 43 271607ca46eSDavid Howells 272607ca46eSDavid Howells /** The node ID of the root inode */ 273607ca46eSDavid Howells #define FUSE_ROOT_ID 1 274607ca46eSDavid Howells 275607ca46eSDavid Howells /* Make sure all structures are padded to 64bit boundary, so 32bit 276607ca46eSDavid Howells userspace works under 64bit kernels */ 277607ca46eSDavid Howells 278607ca46eSDavid Howells struct fuse_attr { 2794c82456eSMiklos Szeredi uint64_t ino; 2804c82456eSMiklos Szeredi uint64_t size; 2814c82456eSMiklos Szeredi uint64_t blocks; 2824c82456eSMiklos Szeredi uint64_t atime; 2834c82456eSMiklos Szeredi uint64_t mtime; 2844c82456eSMiklos Szeredi uint64_t ctime; 2854c82456eSMiklos Szeredi uint32_t atimensec; 2864c82456eSMiklos Szeredi uint32_t mtimensec; 2874c82456eSMiklos Szeredi uint32_t ctimensec; 2884c82456eSMiklos Szeredi uint32_t mode; 2894c82456eSMiklos Szeredi uint32_t nlink; 2904c82456eSMiklos Szeredi uint32_t uid; 2914c82456eSMiklos Szeredi uint32_t gid; 2924c82456eSMiklos Szeredi uint32_t rdev; 2934c82456eSMiklos Szeredi uint32_t blksize; 294c6ff213fSMax Reitz uint32_t flags; 295607ca46eSDavid Howells }; 296607ca46eSDavid Howells 297ba58a37cSMiklos Szeredi /* 298ba58a37cSMiklos Szeredi * The following structures are bit-for-bit compatible with the statx(2) ABI in 299ba58a37cSMiklos Szeredi * Linux. 300ba58a37cSMiklos Szeredi */ 301ba58a37cSMiklos Szeredi struct fuse_sx_time { 302ba58a37cSMiklos Szeredi int64_t tv_sec; 303ba58a37cSMiklos Szeredi uint32_t tv_nsec; 304ba58a37cSMiklos Szeredi int32_t __reserved; 305ba58a37cSMiklos Szeredi }; 306ba58a37cSMiklos Szeredi 307ba58a37cSMiklos Szeredi struct fuse_statx { 308ba58a37cSMiklos Szeredi uint32_t mask; 309ba58a37cSMiklos Szeredi uint32_t blksize; 310ba58a37cSMiklos Szeredi uint64_t attributes; 311ba58a37cSMiklos Szeredi uint32_t nlink; 312ba58a37cSMiklos Szeredi uint32_t uid; 313ba58a37cSMiklos Szeredi uint32_t gid; 314ba58a37cSMiklos Szeredi uint16_t mode; 315ba58a37cSMiklos Szeredi uint16_t __spare0[1]; 316ba58a37cSMiklos Szeredi uint64_t ino; 317ba58a37cSMiklos Szeredi uint64_t size; 318ba58a37cSMiklos Szeredi uint64_t blocks; 319ba58a37cSMiklos Szeredi uint64_t attributes_mask; 320ba58a37cSMiklos Szeredi struct fuse_sx_time atime; 321ba58a37cSMiklos Szeredi struct fuse_sx_time btime; 322ba58a37cSMiklos Szeredi struct fuse_sx_time ctime; 323ba58a37cSMiklos Szeredi struct fuse_sx_time mtime; 324ba58a37cSMiklos Szeredi uint32_t rdev_major; 325ba58a37cSMiklos Szeredi uint32_t rdev_minor; 326ba58a37cSMiklos Szeredi uint32_t dev_major; 327ba58a37cSMiklos Szeredi uint32_t dev_minor; 328ba58a37cSMiklos Szeredi uint64_t __spare2[14]; 329ba58a37cSMiklos Szeredi }; 330ba58a37cSMiklos Szeredi 331607ca46eSDavid Howells struct fuse_kstatfs { 3324c82456eSMiklos Szeredi uint64_t blocks; 3334c82456eSMiklos Szeredi uint64_t bfree; 3344c82456eSMiklos Szeredi uint64_t bavail; 3354c82456eSMiklos Szeredi uint64_t files; 3364c82456eSMiklos Szeredi uint64_t ffree; 3374c82456eSMiklos Szeredi uint32_t bsize; 3384c82456eSMiklos Szeredi uint32_t namelen; 3394c82456eSMiklos Szeredi uint32_t frsize; 3404c82456eSMiklos Szeredi uint32_t padding; 3414c82456eSMiklos Szeredi uint32_t spare[6]; 342607ca46eSDavid Howells }; 343607ca46eSDavid Howells 344607ca46eSDavid Howells struct fuse_file_lock { 3454c82456eSMiklos Szeredi uint64_t start; 3464c82456eSMiklos Szeredi uint64_t end; 3474c82456eSMiklos Szeredi uint32_t type; 3484c82456eSMiklos Szeredi uint32_t pid; /* tgid */ 349607ca46eSDavid Howells }; 350607ca46eSDavid Howells 351607ca46eSDavid Howells /** 352607ca46eSDavid Howells * Bitmasks for fuse_setattr_in.valid 353607ca46eSDavid Howells */ 354607ca46eSDavid Howells #define FATTR_MODE (1 << 0) 355607ca46eSDavid Howells #define FATTR_UID (1 << 1) 356607ca46eSDavid Howells #define FATTR_GID (1 << 2) 357607ca46eSDavid Howells #define FATTR_SIZE (1 << 3) 358607ca46eSDavid Howells #define FATTR_ATIME (1 << 4) 359607ca46eSDavid Howells #define FATTR_MTIME (1 << 5) 360607ca46eSDavid Howells #define FATTR_FH (1 << 6) 361607ca46eSDavid Howells #define FATTR_ATIME_NOW (1 << 7) 362607ca46eSDavid Howells #define FATTR_MTIME_NOW (1 << 8) 363607ca46eSDavid Howells #define FATTR_LOCKOWNER (1 << 9) 364ab9e13f7SMaxim Patlasov #define FATTR_CTIME (1 << 10) 36531792161SVivek Goyal #define FATTR_KILL_SUIDGID (1 << 11) 366607ca46eSDavid Howells 367607ca46eSDavid Howells /** 368607ca46eSDavid Howells * Flags returned by the OPEN request 369607ca46eSDavid Howells * 370607ca46eSDavid Howells * FOPEN_DIRECT_IO: bypass page cache for this open file 371607ca46eSDavid Howells * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 372607ca46eSDavid Howells * FOPEN_NONSEEKABLE: the file is not seekable 3736433b899SMiklos Szeredi * FOPEN_CACHE_DIR: allow caching this directory 374bbd84f33SKirill Smelkov * FOPEN_STREAM: the file is stream-like (no file position at all) 375a390ccb3SAmir Goldstein * FOPEN_NOFLUSH: don't flush data cache on close (unless FUSE_WRITEBACK_CACHE) 37615352405SDharmendra Singh * FOPEN_PARALLEL_DIRECT_WRITES: Allow concurrent direct writes on the same inode 3777dc4e97aSAmir Goldstein * FOPEN_PASSTHROUGH: passthrough read/write io for this open file 378607ca46eSDavid Howells */ 379607ca46eSDavid Howells #define FOPEN_DIRECT_IO (1 << 0) 380607ca46eSDavid Howells #define FOPEN_KEEP_CACHE (1 << 1) 381607ca46eSDavid Howells #define FOPEN_NONSEEKABLE (1 << 2) 3826433b899SMiklos Szeredi #define FOPEN_CACHE_DIR (1 << 3) 383bbd84f33SKirill Smelkov #define FOPEN_STREAM (1 << 4) 384a390ccb3SAmir Goldstein #define FOPEN_NOFLUSH (1 << 5) 38515352405SDharmendra Singh #define FOPEN_PARALLEL_DIRECT_WRITES (1 << 6) 3867dc4e97aSAmir Goldstein #define FOPEN_PASSTHROUGH (1 << 7) 387607ca46eSDavid Howells 388607ca46eSDavid Howells /** 389607ca46eSDavid Howells * INIT request/reply flags 390607ca46eSDavid Howells * 391607ca46eSDavid Howells * FUSE_ASYNC_READ: asynchronous read requests 392607ca46eSDavid Howells * FUSE_POSIX_LOCKS: remote locking for POSIX file locks 393607ca46eSDavid Howells * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported) 394607ca46eSDavid Howells * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem 395607ca46eSDavid Howells * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." 396607ca46eSDavid Howells * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB 397607ca46eSDavid Howells * FUSE_DONT_MASK: don't apply umask to file mode on create operations 398607ca46eSDavid Howells * FUSE_SPLICE_WRITE: kernel supports splice write on the device 399607ca46eSDavid Howells * FUSE_SPLICE_MOVE: kernel supports splice move on the device 400607ca46eSDavid Howells * FUSE_SPLICE_READ: kernel supports splice read on the device 401607ca46eSDavid Howells * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks 402607ca46eSDavid Howells * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories 403607ca46eSDavid Howells * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages 404634734b6SEric Wong * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one) 405634734b6SEric Wong * FUSE_READDIRPLUS_AUTO: adaptive readdirplus 40660b9df7aSMiklos Szeredi * FUSE_ASYNC_DIO: asynchronous direct I/O submission 4074d99ff8fSPavel Emelyanov * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes 408d7afaec0SAndrew Gallagher * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens 4095c672ab3SMiklos Szeredi * FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir 4105e940c1dSMiklos Szeredi * FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc 41160bcc88aSSeth Forshee * FUSE_POSIX_ACL: filesystem supports posix acls 4123b7008b2SSzymon Lukasz * FUSE_ABORT_ERROR: reading the device after abort returns ECONNABORTED 4135da784ccSConstantine Shulyupin * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages 4145571f1e6SDan Schatzberg * FUSE_CACHE_SYMLINKS: cache READLINK responses 415d9a9ea94SChad Austin * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir 416ad2ba64dSKirill Smelkov * FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request 417fd1a1dc6SStefan Hajnoczi * FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for 418fd1a1dc6SStefan Hajnoczi * foffset and moffset fields in struct 419fd1a1dc6SStefan Hajnoczi * fuse_setupmapping_out and fuse_removemapping_one. 420c6ff213fSMax Reitz * FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts 42163f9909fSVivek Goyal * FUSE_HANDLE_KILLPRIV_V2: fs kills suid/sgid/cap on write/chown/trunc. 42263f9909fSVivek Goyal * Upon write/truncate suid/sgid is only killed if caller 42363f9909fSVivek Goyal * does not have CAP_FSETID. Additionally upon 42463f9909fSVivek Goyal * write/truncate sgid is killed only if file has group 42563f9909fSVivek Goyal * execute permission. (Same as Linux VFS behavior). 42652a4c95fSVivek Goyal * FUSE_SETXATTR_EXT: Server supports extended struct fuse_setxattr_in 42753db2893SMiklos Szeredi * FUSE_INIT_EXT: extended fuse_init_in request 42853db2893SMiklos Szeredi * FUSE_INIT_RESERVED: reserved, do not use 4293e2b6fdbSVivek Goyal * FUSE_SECURITY_CTX: add security context to create, mkdir, symlink, and 4303e2b6fdbSVivek Goyal * mknod 43198046f74SJeffle Xu * FUSE_HAS_INODE_DAX: use per inode DAX 4328ed7cb3fSMiklos Szeredi * FUSE_CREATE_SUPP_GROUP: add supplementary group info to create, mkdir, 4338ed7cb3fSMiklos Szeredi * symlink and mknod (single group that matches parent) 4345cadfbd5SMiklos Szeredi * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation 435c55e0a55STyler Fanelli * FUSE_DIRECT_IO_ALLOW_MMAP: allow shared mmap in FOPEN_DIRECT_IO mode. 436e022f6a1SJingbo Xu * FUSE_NO_EXPORT_SUPPORT: explicitly disable export support 4379e7f5296SZhao Chen * FUSE_HAS_RESEND: kernel supports resending pending requests, and the high bit 4389e7f5296SZhao Chen * of the request ID indicates resend requests 43916e1503eSAlexander Mikhalitsyn * FUSE_ALLOW_IDMAP: allow creation of idmapped mounts 44024fe962cSBernd Schubert * FUSE_OVER_IO_URING: Indicate that client supports io-uring 441*0f6439f6SJoanne Koong * FUSE_REQUEST_TIMEOUT: kernel supports timing out requests. 442*0f6439f6SJoanne Koong * init_out.request_timeout contains the timeout (in secs) 443607ca46eSDavid Howells */ 444607ca46eSDavid Howells #define FUSE_ASYNC_READ (1 << 0) 445607ca46eSDavid Howells #define FUSE_POSIX_LOCKS (1 << 1) 446607ca46eSDavid Howells #define FUSE_FILE_OPS (1 << 2) 447607ca46eSDavid Howells #define FUSE_ATOMIC_O_TRUNC (1 << 3) 448607ca46eSDavid Howells #define FUSE_EXPORT_SUPPORT (1 << 4) 449607ca46eSDavid Howells #define FUSE_BIG_WRITES (1 << 5) 450607ca46eSDavid Howells #define FUSE_DONT_MASK (1 << 6) 451607ca46eSDavid Howells #define FUSE_SPLICE_WRITE (1 << 7) 452607ca46eSDavid Howells #define FUSE_SPLICE_MOVE (1 << 8) 453607ca46eSDavid Howells #define FUSE_SPLICE_READ (1 << 9) 454607ca46eSDavid Howells #define FUSE_FLOCK_LOCKS (1 << 10) 455607ca46eSDavid Howells #define FUSE_HAS_IOCTL_DIR (1 << 11) 456607ca46eSDavid Howells #define FUSE_AUTO_INVAL_DATA (1 << 12) 4570b05b183SAnand V. Avati #define FUSE_DO_READDIRPLUS (1 << 13) 458634734b6SEric Wong #define FUSE_READDIRPLUS_AUTO (1 << 14) 45960b9df7aSMiklos Szeredi #define FUSE_ASYNC_DIO (1 << 15) 4604d99ff8fSPavel Emelyanov #define FUSE_WRITEBACK_CACHE (1 << 16) 461d7afaec0SAndrew Gallagher #define FUSE_NO_OPEN_SUPPORT (1 << 17) 4625c672ab3SMiklos Szeredi #define FUSE_PARALLEL_DIROPS (1 << 18) 4635e940c1dSMiklos Szeredi #define FUSE_HANDLE_KILLPRIV (1 << 19) 46460bcc88aSSeth Forshee #define FUSE_POSIX_ACL (1 << 20) 4653b7008b2SSzymon Lukasz #define FUSE_ABORT_ERROR (1 << 21) 4665da784ccSConstantine Shulyupin #define FUSE_MAX_PAGES (1 << 22) 4675571f1e6SDan Schatzberg #define FUSE_CACHE_SYMLINKS (1 << 23) 468d9a9ea94SChad Austin #define FUSE_NO_OPENDIR_SUPPORT (1 << 24) 469ad2ba64dSKirill Smelkov #define FUSE_EXPLICIT_INVAL_DATA (1 << 25) 470c4bb667eSDr. David Alan Gilbert #define FUSE_MAP_ALIGNMENT (1 << 26) 471c6ff213fSMax Reitz #define FUSE_SUBMOUNTS (1 << 27) 47263f9909fSVivek Goyal #define FUSE_HANDLE_KILLPRIV_V2 (1 << 28) 47352a4c95fSVivek Goyal #define FUSE_SETXATTR_EXT (1 << 29) 47453db2893SMiklos Szeredi #define FUSE_INIT_EXT (1 << 30) 47553db2893SMiklos Szeredi #define FUSE_INIT_RESERVED (1 << 31) 47653db2893SMiklos Szeredi /* bits 32..63 get shifted down 32 bits into the flags2 field */ 4773e2b6fdbSVivek Goyal #define FUSE_SECURITY_CTX (1ULL << 32) 47898046f74SJeffle Xu #define FUSE_HAS_INODE_DAX (1ULL << 33) 4798ed7cb3fSMiklos Szeredi #define FUSE_CREATE_SUPP_GROUP (1ULL << 34) 4805cadfbd5SMiklos Szeredi #define FUSE_HAS_EXPIRE_ONLY (1ULL << 35) 481c55e0a55STyler Fanelli #define FUSE_DIRECT_IO_ALLOW_MMAP (1ULL << 36) 4827dc4e97aSAmir Goldstein #define FUSE_PASSTHROUGH (1ULL << 37) 483e022f6a1SJingbo Xu #define FUSE_NO_EXPORT_SUPPORT (1ULL << 38) 4849e7f5296SZhao Chen #define FUSE_HAS_RESEND (1ULL << 39) 485c55e0a55STyler Fanelli /* Obsolete alias for FUSE_DIRECT_IO_ALLOW_MMAP */ 486c55e0a55STyler Fanelli #define FUSE_DIRECT_IO_RELAX FUSE_DIRECT_IO_ALLOW_MMAP 48716e1503eSAlexander Mikhalitsyn #define FUSE_ALLOW_IDMAP (1ULL << 40) 48824fe962cSBernd Schubert #define FUSE_OVER_IO_URING (1ULL << 41) 489*0f6439f6SJoanne Koong #define FUSE_REQUEST_TIMEOUT (1ULL << 42) 490607ca46eSDavid Howells 491607ca46eSDavid Howells /** 492607ca46eSDavid Howells * CUSE INIT request/reply flags 493607ca46eSDavid Howells * 494607ca46eSDavid Howells * CUSE_UNRESTRICTED_IOCTL: use unrestricted ioctl 495607ca46eSDavid Howells */ 496607ca46eSDavid Howells #define CUSE_UNRESTRICTED_IOCTL (1 << 0) 497607ca46eSDavid Howells 498607ca46eSDavid Howells /** 499607ca46eSDavid Howells * Release flags 500607ca46eSDavid Howells */ 501607ca46eSDavid Howells #define FUSE_RELEASE_FLUSH (1 << 0) 502607ca46eSDavid Howells #define FUSE_RELEASE_FLOCK_UNLOCK (1 << 1) 503607ca46eSDavid Howells 504607ca46eSDavid Howells /** 505607ca46eSDavid Howells * Getattr flags 506607ca46eSDavid Howells */ 507607ca46eSDavid Howells #define FUSE_GETATTR_FH (1 << 0) 508607ca46eSDavid Howells 509607ca46eSDavid Howells /** 510607ca46eSDavid Howells * Lock flags 511607ca46eSDavid Howells */ 512607ca46eSDavid Howells #define FUSE_LK_FLOCK (1 << 0) 513607ca46eSDavid Howells 514607ca46eSDavid Howells /** 515607ca46eSDavid Howells * WRITE flags 516607ca46eSDavid Howells * 517607ca46eSDavid Howells * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed 518607ca46eSDavid Howells * FUSE_WRITE_LOCKOWNER: lock_owner field is valid 51910c52c84SMiklos Szeredi * FUSE_WRITE_KILL_SUIDGID: kill suid and sgid bits 520607ca46eSDavid Howells */ 521607ca46eSDavid Howells #define FUSE_WRITE_CACHE (1 << 0) 522607ca46eSDavid Howells #define FUSE_WRITE_LOCKOWNER (1 << 1) 52310c52c84SMiklos Szeredi #define FUSE_WRITE_KILL_SUIDGID (1 << 2) 52410c52c84SMiklos Szeredi 52510c52c84SMiklos Szeredi /* Obsolete alias; this flag implies killing suid/sgid only. */ 52610c52c84SMiklos Szeredi #define FUSE_WRITE_KILL_PRIV FUSE_WRITE_KILL_SUIDGID 527607ca46eSDavid Howells 528607ca46eSDavid Howells /** 529607ca46eSDavid Howells * Read flags 530607ca46eSDavid Howells */ 531607ca46eSDavid Howells #define FUSE_READ_LOCKOWNER (1 << 1) 532607ca46eSDavid Howells 533607ca46eSDavid Howells /** 534607ca46eSDavid Howells * Ioctl flags 535607ca46eSDavid Howells * 536607ca46eSDavid Howells * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine 537607ca46eSDavid Howells * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed 538607ca46eSDavid Howells * FUSE_IOCTL_RETRY: retry with new iovecs 539607ca46eSDavid Howells * FUSE_IOCTL_32BIT: 32bit ioctl 540607ca46eSDavid Howells * FUSE_IOCTL_DIR: is a directory 5416407f44aSIan Abbott * FUSE_IOCTL_COMPAT_X32: x32 compat ioctl on 64bit machine (64bit time_t) 542607ca46eSDavid Howells * 543607ca46eSDavid Howells * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs 544607ca46eSDavid Howells */ 545607ca46eSDavid Howells #define FUSE_IOCTL_COMPAT (1 << 0) 546607ca46eSDavid Howells #define FUSE_IOCTL_UNRESTRICTED (1 << 1) 547607ca46eSDavid Howells #define FUSE_IOCTL_RETRY (1 << 2) 548607ca46eSDavid Howells #define FUSE_IOCTL_32BIT (1 << 3) 549607ca46eSDavid Howells #define FUSE_IOCTL_DIR (1 << 4) 5506407f44aSIan Abbott #define FUSE_IOCTL_COMPAT_X32 (1 << 5) 551607ca46eSDavid Howells 552607ca46eSDavid Howells #define FUSE_IOCTL_MAX_IOV 256 553607ca46eSDavid Howells 554607ca46eSDavid Howells /** 555607ca46eSDavid Howells * Poll flags 556607ca46eSDavid Howells * 557607ca46eSDavid Howells * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify 558607ca46eSDavid Howells */ 559607ca46eSDavid Howells #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0) 560607ca46eSDavid Howells 561154603feSAlan Somers /** 562154603feSAlan Somers * Fsync flags 563154603feSAlan Somers * 564154603feSAlan Somers * FUSE_FSYNC_FDATASYNC: Sync data only, not metadata 565154603feSAlan Somers */ 566154603feSAlan Somers #define FUSE_FSYNC_FDATASYNC (1 << 0) 567154603feSAlan Somers 568c6ff213fSMax Reitz /** 569c6ff213fSMax Reitz * fuse_attr flags 570c6ff213fSMax Reitz * 571c6ff213fSMax Reitz * FUSE_ATTR_SUBMOUNT: Object is a submount root 57298046f74SJeffle Xu * FUSE_ATTR_DAX: Enable DAX for this file in per inode DAX mode 573c6ff213fSMax Reitz */ 574c6ff213fSMax Reitz #define FUSE_ATTR_SUBMOUNT (1 << 0) 57598046f74SJeffle Xu #define FUSE_ATTR_DAX (1 << 1) 576c6ff213fSMax Reitz 577643a666aSVivek Goyal /** 578643a666aSVivek Goyal * Open flags 579643a666aSVivek Goyal * FUSE_OPEN_KILL_SUIDGID: Kill suid and sgid if executable 580643a666aSVivek Goyal */ 581643a666aSVivek Goyal #define FUSE_OPEN_KILL_SUIDGID (1 << 0) 582643a666aSVivek Goyal 583550a7d3bSVivek Goyal /** 584550a7d3bSVivek Goyal * setxattr flags 585550a7d3bSVivek Goyal * FUSE_SETXATTR_ACL_KILL_SGID: Clear SGID when system.posix_acl_access is set 586550a7d3bSVivek Goyal */ 587550a7d3bSVivek Goyal #define FUSE_SETXATTR_ACL_KILL_SGID (1 << 0) 588550a7d3bSVivek Goyal 5894f8d3702SMiklos Szeredi /** 5904f8d3702SMiklos Szeredi * notify_inval_entry flags 5914f8d3702SMiklos Szeredi * FUSE_EXPIRE_ONLY 5924f8d3702SMiklos Szeredi */ 5934f8d3702SMiklos Szeredi #define FUSE_EXPIRE_ONLY (1 << 0) 5944f8d3702SMiklos Szeredi 59515d937d7SMiklos Szeredi /** 59615d937d7SMiklos Szeredi * extension type 59715d937d7SMiklos Szeredi * FUSE_MAX_NR_SECCTX: maximum value of &fuse_secctx_header.nr_secctx 5988ed7cb3fSMiklos Szeredi * FUSE_EXT_GROUPS: &fuse_supp_groups extension 59915d937d7SMiklos Szeredi */ 60015d937d7SMiklos Szeredi enum fuse_ext_type { 60115d937d7SMiklos Szeredi /* Types 0..31 are reserved for fuse_secctx_header */ 60215d937d7SMiklos Szeredi FUSE_MAX_NR_SECCTX = 31, 6038ed7cb3fSMiklos Szeredi FUSE_EXT_GROUPS = 32, 60415d937d7SMiklos Szeredi }; 60515d937d7SMiklos Szeredi 606607ca46eSDavid Howells enum fuse_opcode { 607607ca46eSDavid Howells FUSE_LOOKUP = 1, 608607ca46eSDavid Howells FUSE_FORGET = 2, /* no reply */ 609607ca46eSDavid Howells FUSE_GETATTR = 3, 610607ca46eSDavid Howells FUSE_SETATTR = 4, 611607ca46eSDavid Howells FUSE_READLINK = 5, 612607ca46eSDavid Howells FUSE_SYMLINK = 6, 613607ca46eSDavid Howells FUSE_MKNOD = 8, 614607ca46eSDavid Howells FUSE_MKDIR = 9, 615607ca46eSDavid Howells FUSE_UNLINK = 10, 616607ca46eSDavid Howells FUSE_RMDIR = 11, 617607ca46eSDavid Howells FUSE_RENAME = 12, 618607ca46eSDavid Howells FUSE_LINK = 13, 619607ca46eSDavid Howells FUSE_OPEN = 14, 620607ca46eSDavid Howells FUSE_READ = 15, 621607ca46eSDavid Howells FUSE_WRITE = 16, 622607ca46eSDavid Howells FUSE_STATFS = 17, 623607ca46eSDavid Howells FUSE_RELEASE = 18, 624607ca46eSDavid Howells FUSE_FSYNC = 20, 625607ca46eSDavid Howells FUSE_SETXATTR = 21, 626607ca46eSDavid Howells FUSE_GETXATTR = 22, 627607ca46eSDavid Howells FUSE_LISTXATTR = 23, 628607ca46eSDavid Howells FUSE_REMOVEXATTR = 24, 629607ca46eSDavid Howells FUSE_FLUSH = 25, 630607ca46eSDavid Howells FUSE_INIT = 26, 631607ca46eSDavid Howells FUSE_OPENDIR = 27, 632607ca46eSDavid Howells FUSE_READDIR = 28, 633607ca46eSDavid Howells FUSE_RELEASEDIR = 29, 634607ca46eSDavid Howells FUSE_FSYNCDIR = 30, 635607ca46eSDavid Howells FUSE_GETLK = 31, 636607ca46eSDavid Howells FUSE_SETLK = 32, 637607ca46eSDavid Howells FUSE_SETLKW = 33, 638607ca46eSDavid Howells FUSE_ACCESS = 34, 639607ca46eSDavid Howells FUSE_CREATE = 35, 640607ca46eSDavid Howells FUSE_INTERRUPT = 36, 641607ca46eSDavid Howells FUSE_BMAP = 37, 642607ca46eSDavid Howells FUSE_DESTROY = 38, 643607ca46eSDavid Howells FUSE_IOCTL = 39, 644607ca46eSDavid Howells FUSE_POLL = 40, 645607ca46eSDavid Howells FUSE_NOTIFY_REPLY = 41, 646607ca46eSDavid Howells FUSE_BATCH_FORGET = 42, 647607ca46eSDavid Howells FUSE_FALLOCATE = 43, 6480b05b183SAnand V. Avati FUSE_READDIRPLUS = 44, 6491560c974SMiklos Szeredi FUSE_RENAME2 = 45, 6500b5da8dbSRavishankar N FUSE_LSEEK = 46, 65188bc7d50SNiels de Vos FUSE_COPY_FILE_RANGE = 47, 652c4bb667eSDr. David Alan Gilbert FUSE_SETUPMAPPING = 48, 653c4bb667eSDr. David Alan Gilbert FUSE_REMOVEMAPPING = 49, 6542d82ab25SGreg Kurz FUSE_SYNCFS = 50, 6557d375390SMiklos Szeredi FUSE_TMPFILE = 51, 656ba58a37cSMiklos Szeredi FUSE_STATX = 52, 657607ca46eSDavid Howells 658607ca46eSDavid Howells /* CUSE specific operations */ 659607ca46eSDavid Howells CUSE_INIT = 4096, 660501ae8ecSMichael S. Tsirkin 661501ae8ecSMichael S. Tsirkin /* Reserved opcodes: helpful to detect structure endian-ness */ 662501ae8ecSMichael S. Tsirkin CUSE_INIT_BSWAP_RESERVED = 1048576, /* CUSE_INIT << 8 */ 663501ae8ecSMichael S. Tsirkin FUSE_INIT_BSWAP_RESERVED = 436207616, /* FUSE_INIT << 24 */ 664607ca46eSDavid Howells }; 665607ca46eSDavid Howells 666607ca46eSDavid Howells enum fuse_notify_code { 667607ca46eSDavid Howells FUSE_NOTIFY_POLL = 1, 668607ca46eSDavid Howells FUSE_NOTIFY_INVAL_INODE = 2, 669607ca46eSDavid Howells FUSE_NOTIFY_INVAL_ENTRY = 3, 670607ca46eSDavid Howells FUSE_NOTIFY_STORE = 4, 671607ca46eSDavid Howells FUSE_NOTIFY_RETRIEVE = 5, 672607ca46eSDavid Howells FUSE_NOTIFY_DELETE = 6, 673760eac73SZhao Chen FUSE_NOTIFY_RESEND = 7, 674607ca46eSDavid Howells FUSE_NOTIFY_CODE_MAX, 675607ca46eSDavid Howells }; 676607ca46eSDavid Howells 677607ca46eSDavid Howells /* The read buffer is required to be at least 8k, but may be much larger */ 678607ca46eSDavid Howells #define FUSE_MIN_READ_BUFFER 8192 679607ca46eSDavid Howells 680607ca46eSDavid Howells #define FUSE_COMPAT_ENTRY_OUT_SIZE 120 681607ca46eSDavid Howells 682607ca46eSDavid Howells struct fuse_entry_out { 6834c82456eSMiklos Szeredi uint64_t nodeid; /* Inode ID */ 6844c82456eSMiklos Szeredi uint64_t generation; /* Inode generation: nodeid:gen must 685607ca46eSDavid Howells be unique for the fs's lifetime */ 6864c82456eSMiklos Szeredi uint64_t entry_valid; /* Cache timeout for the name */ 6874c82456eSMiklos Szeredi uint64_t attr_valid; /* Cache timeout for the attributes */ 6884c82456eSMiklos Szeredi uint32_t entry_valid_nsec; 6894c82456eSMiklos Szeredi uint32_t attr_valid_nsec; 690607ca46eSDavid Howells struct fuse_attr attr; 691607ca46eSDavid Howells }; 692607ca46eSDavid Howells 693607ca46eSDavid Howells struct fuse_forget_in { 6944c82456eSMiklos Szeredi uint64_t nlookup; 695607ca46eSDavid Howells }; 696607ca46eSDavid Howells 697607ca46eSDavid Howells struct fuse_forget_one { 6984c82456eSMiklos Szeredi uint64_t nodeid; 6994c82456eSMiklos Szeredi uint64_t nlookup; 700607ca46eSDavid Howells }; 701607ca46eSDavid Howells 702607ca46eSDavid Howells struct fuse_batch_forget_in { 7034c82456eSMiklos Szeredi uint32_t count; 7044c82456eSMiklos Szeredi uint32_t dummy; 705607ca46eSDavid Howells }; 706607ca46eSDavid Howells 707607ca46eSDavid Howells struct fuse_getattr_in { 7084c82456eSMiklos Szeredi uint32_t getattr_flags; 7094c82456eSMiklos Szeredi uint32_t dummy; 7104c82456eSMiklos Szeredi uint64_t fh; 711607ca46eSDavid Howells }; 712607ca46eSDavid Howells 713607ca46eSDavid Howells #define FUSE_COMPAT_ATTR_OUT_SIZE 96 714607ca46eSDavid Howells 715607ca46eSDavid Howells struct fuse_attr_out { 7164c82456eSMiklos Szeredi uint64_t attr_valid; /* Cache timeout for the attributes */ 7174c82456eSMiklos Szeredi uint32_t attr_valid_nsec; 7184c82456eSMiklos Szeredi uint32_t dummy; 719607ca46eSDavid Howells struct fuse_attr attr; 720607ca46eSDavid Howells }; 721607ca46eSDavid Howells 722ba58a37cSMiklos Szeredi struct fuse_statx_in { 723ba58a37cSMiklos Szeredi uint32_t getattr_flags; 724ba58a37cSMiklos Szeredi uint32_t reserved; 725ba58a37cSMiklos Szeredi uint64_t fh; 726ba58a37cSMiklos Szeredi uint32_t sx_flags; 727ba58a37cSMiklos Szeredi uint32_t sx_mask; 728ba58a37cSMiklos Szeredi }; 729ba58a37cSMiklos Szeredi 730ba58a37cSMiklos Szeredi struct fuse_statx_out { 731ba58a37cSMiklos Szeredi uint64_t attr_valid; /* Cache timeout for the attributes */ 732ba58a37cSMiklos Szeredi uint32_t attr_valid_nsec; 733ba58a37cSMiklos Szeredi uint32_t flags; 734ba58a37cSMiklos Szeredi uint64_t spare[2]; 735ba58a37cSMiklos Szeredi struct fuse_statx stat; 736ba58a37cSMiklos Szeredi }; 737ba58a37cSMiklos Szeredi 738607ca46eSDavid Howells #define FUSE_COMPAT_MKNOD_IN_SIZE 8 739607ca46eSDavid Howells 740607ca46eSDavid Howells struct fuse_mknod_in { 7414c82456eSMiklos Szeredi uint32_t mode; 7424c82456eSMiklos Szeredi uint32_t rdev; 7434c82456eSMiklos Szeredi uint32_t umask; 7444c82456eSMiklos Szeredi uint32_t padding; 745607ca46eSDavid Howells }; 746607ca46eSDavid Howells 747607ca46eSDavid Howells struct fuse_mkdir_in { 7484c82456eSMiklos Szeredi uint32_t mode; 7494c82456eSMiklos Szeredi uint32_t umask; 750607ca46eSDavid Howells }; 751607ca46eSDavid Howells 752607ca46eSDavid Howells struct fuse_rename_in { 7534c82456eSMiklos Szeredi uint64_t newdir; 754607ca46eSDavid Howells }; 755607ca46eSDavid Howells 7561560c974SMiklos Szeredi struct fuse_rename2_in { 7571560c974SMiklos Szeredi uint64_t newdir; 7581560c974SMiklos Szeredi uint32_t flags; 7591560c974SMiklos Szeredi uint32_t padding; 7601560c974SMiklos Szeredi }; 7611560c974SMiklos Szeredi 762607ca46eSDavid Howells struct fuse_link_in { 7634c82456eSMiklos Szeredi uint64_t oldnodeid; 764607ca46eSDavid Howells }; 765607ca46eSDavid Howells 766607ca46eSDavid Howells struct fuse_setattr_in { 7674c82456eSMiklos Szeredi uint32_t valid; 7684c82456eSMiklos Szeredi uint32_t padding; 7694c82456eSMiklos Szeredi uint64_t fh; 7704c82456eSMiklos Szeredi uint64_t size; 7714c82456eSMiklos Szeredi uint64_t lock_owner; 7724c82456eSMiklos Szeredi uint64_t atime; 7734c82456eSMiklos Szeredi uint64_t mtime; 774ab9e13f7SMaxim Patlasov uint64_t ctime; 7754c82456eSMiklos Szeredi uint32_t atimensec; 7764c82456eSMiklos Szeredi uint32_t mtimensec; 777ab9e13f7SMaxim Patlasov uint32_t ctimensec; 7784c82456eSMiklos Szeredi uint32_t mode; 7794c82456eSMiklos Szeredi uint32_t unused4; 7804c82456eSMiklos Szeredi uint32_t uid; 7814c82456eSMiklos Szeredi uint32_t gid; 7824c82456eSMiklos Szeredi uint32_t unused5; 783607ca46eSDavid Howells }; 784607ca46eSDavid Howells 785607ca46eSDavid Howells struct fuse_open_in { 7864c82456eSMiklos Szeredi uint32_t flags; 787643a666aSVivek Goyal uint32_t open_flags; /* FUSE_OPEN_... */ 788607ca46eSDavid Howells }; 789607ca46eSDavid Howells 790607ca46eSDavid Howells struct fuse_create_in { 7914c82456eSMiklos Szeredi uint32_t flags; 7924c82456eSMiklos Szeredi uint32_t mode; 7934c82456eSMiklos Szeredi uint32_t umask; 794643a666aSVivek Goyal uint32_t open_flags; /* FUSE_OPEN_... */ 795607ca46eSDavid Howells }; 796607ca46eSDavid Howells 797607ca46eSDavid Howells struct fuse_open_out { 7984c82456eSMiklos Szeredi uint64_t fh; 7994c82456eSMiklos Szeredi uint32_t open_flags; 8007dc4e97aSAmir Goldstein int32_t backing_id; 801607ca46eSDavid Howells }; 802607ca46eSDavid Howells 803607ca46eSDavid Howells struct fuse_release_in { 8044c82456eSMiklos Szeredi uint64_t fh; 8054c82456eSMiklos Szeredi uint32_t flags; 8064c82456eSMiklos Szeredi uint32_t release_flags; 8074c82456eSMiklos Szeredi uint64_t lock_owner; 808607ca46eSDavid Howells }; 809607ca46eSDavid Howells 810607ca46eSDavid Howells struct fuse_flush_in { 8114c82456eSMiklos Szeredi uint64_t fh; 8124c82456eSMiklos Szeredi uint32_t unused; 8134c82456eSMiklos Szeredi uint32_t padding; 8144c82456eSMiklos Szeredi uint64_t lock_owner; 815607ca46eSDavid Howells }; 816607ca46eSDavid Howells 817607ca46eSDavid Howells struct fuse_read_in { 8184c82456eSMiklos Szeredi uint64_t fh; 8194c82456eSMiklos Szeredi uint64_t offset; 8204c82456eSMiklos Szeredi uint32_t size; 8214c82456eSMiklos Szeredi uint32_t read_flags; 8224c82456eSMiklos Szeredi uint64_t lock_owner; 8234c82456eSMiklos Szeredi uint32_t flags; 8244c82456eSMiklos Szeredi uint32_t padding; 825607ca46eSDavid Howells }; 826607ca46eSDavid Howells 827607ca46eSDavid Howells #define FUSE_COMPAT_WRITE_IN_SIZE 24 828607ca46eSDavid Howells 829607ca46eSDavid Howells struct fuse_write_in { 8304c82456eSMiklos Szeredi uint64_t fh; 8314c82456eSMiklos Szeredi uint64_t offset; 8324c82456eSMiklos Szeredi uint32_t size; 8334c82456eSMiklos Szeredi uint32_t write_flags; 8344c82456eSMiklos Szeredi uint64_t lock_owner; 8354c82456eSMiklos Szeredi uint32_t flags; 8364c82456eSMiklos Szeredi uint32_t padding; 837607ca46eSDavid Howells }; 838607ca46eSDavid Howells 839607ca46eSDavid Howells struct fuse_write_out { 8404c82456eSMiklos Szeredi uint32_t size; 8414c82456eSMiklos Szeredi uint32_t padding; 842607ca46eSDavid Howells }; 843607ca46eSDavid Howells 844607ca46eSDavid Howells #define FUSE_COMPAT_STATFS_SIZE 48 845607ca46eSDavid Howells 846607ca46eSDavid Howells struct fuse_statfs_out { 847607ca46eSDavid Howells struct fuse_kstatfs st; 848607ca46eSDavid Howells }; 849607ca46eSDavid Howells 850607ca46eSDavid Howells struct fuse_fsync_in { 8514c82456eSMiklos Szeredi uint64_t fh; 8524c82456eSMiklos Szeredi uint32_t fsync_flags; 8534c82456eSMiklos Szeredi uint32_t padding; 854607ca46eSDavid Howells }; 855607ca46eSDavid Howells 85652a4c95fSVivek Goyal #define FUSE_COMPAT_SETXATTR_IN_SIZE 8 85752a4c95fSVivek Goyal 858607ca46eSDavid Howells struct fuse_setxattr_in { 8594c82456eSMiklos Szeredi uint32_t size; 8604c82456eSMiklos Szeredi uint32_t flags; 86152a4c95fSVivek Goyal uint32_t setxattr_flags; 86252a4c95fSVivek Goyal uint32_t padding; 863607ca46eSDavid Howells }; 864607ca46eSDavid Howells 865607ca46eSDavid Howells struct fuse_getxattr_in { 8664c82456eSMiklos Szeredi uint32_t size; 8674c82456eSMiklos Szeredi uint32_t padding; 868607ca46eSDavid Howells }; 869607ca46eSDavid Howells 870607ca46eSDavid Howells struct fuse_getxattr_out { 8714c82456eSMiklos Szeredi uint32_t size; 8724c82456eSMiklos Szeredi uint32_t padding; 873607ca46eSDavid Howells }; 874607ca46eSDavid Howells 875607ca46eSDavid Howells struct fuse_lk_in { 8764c82456eSMiklos Szeredi uint64_t fh; 8774c82456eSMiklos Szeredi uint64_t owner; 878607ca46eSDavid Howells struct fuse_file_lock lk; 8794c82456eSMiklos Szeredi uint32_t lk_flags; 8804c82456eSMiklos Szeredi uint32_t padding; 881607ca46eSDavid Howells }; 882607ca46eSDavid Howells 883607ca46eSDavid Howells struct fuse_lk_out { 884607ca46eSDavid Howells struct fuse_file_lock lk; 885607ca46eSDavid Howells }; 886607ca46eSDavid Howells 887607ca46eSDavid Howells struct fuse_access_in { 8884c82456eSMiklos Szeredi uint32_t mask; 8894c82456eSMiklos Szeredi uint32_t padding; 890607ca46eSDavid Howells }; 891607ca46eSDavid Howells 892607ca46eSDavid Howells struct fuse_init_in { 8934c82456eSMiklos Szeredi uint32_t major; 8944c82456eSMiklos Szeredi uint32_t minor; 8954c82456eSMiklos Szeredi uint32_t max_readahead; 8964c82456eSMiklos Szeredi uint32_t flags; 89753db2893SMiklos Szeredi uint32_t flags2; 89853db2893SMiklos Szeredi uint32_t unused[11]; 899607ca46eSDavid Howells }; 900607ca46eSDavid Howells 901e27c9d38SMiklos Szeredi #define FUSE_COMPAT_INIT_OUT_SIZE 8 902e27c9d38SMiklos Szeredi #define FUSE_COMPAT_22_INIT_OUT_SIZE 24 903e27c9d38SMiklos Szeredi 904607ca46eSDavid Howells struct fuse_init_out { 9054c82456eSMiklos Szeredi uint32_t major; 9064c82456eSMiklos Szeredi uint32_t minor; 9074c82456eSMiklos Szeredi uint32_t max_readahead; 9084c82456eSMiklos Szeredi uint32_t flags; 9094c82456eSMiklos Szeredi uint16_t max_background; 9104c82456eSMiklos Szeredi uint16_t congestion_threshold; 9114c82456eSMiklos Szeredi uint32_t max_write; 912e27c9d38SMiklos Szeredi uint32_t time_gran; 9135da784ccSConstantine Shulyupin uint16_t max_pages; 914c4bb667eSDr. David Alan Gilbert uint16_t map_alignment; 91553db2893SMiklos Szeredi uint32_t flags2; 9167dc4e97aSAmir Goldstein uint32_t max_stack_depth; 917*0f6439f6SJoanne Koong uint16_t request_timeout; 918*0f6439f6SJoanne Koong uint16_t unused[11]; 919607ca46eSDavid Howells }; 920607ca46eSDavid Howells 921607ca46eSDavid Howells #define CUSE_INIT_INFO_MAX 4096 922607ca46eSDavid Howells 923607ca46eSDavid Howells struct cuse_init_in { 9244c82456eSMiklos Szeredi uint32_t major; 9254c82456eSMiklos Szeredi uint32_t minor; 9264c82456eSMiklos Szeredi uint32_t unused; 9274c82456eSMiklos Szeredi uint32_t flags; 928607ca46eSDavid Howells }; 929607ca46eSDavid Howells 930607ca46eSDavid Howells struct cuse_init_out { 9314c82456eSMiklos Szeredi uint32_t major; 9324c82456eSMiklos Szeredi uint32_t minor; 9334c82456eSMiklos Szeredi uint32_t unused; 9344c82456eSMiklos Szeredi uint32_t flags; 9354c82456eSMiklos Szeredi uint32_t max_read; 9364c82456eSMiklos Szeredi uint32_t max_write; 9374c82456eSMiklos Szeredi uint32_t dev_major; /* chardev major */ 9384c82456eSMiklos Szeredi uint32_t dev_minor; /* chardev minor */ 9394c82456eSMiklos Szeredi uint32_t spare[10]; 940607ca46eSDavid Howells }; 941607ca46eSDavid Howells 942607ca46eSDavid Howells struct fuse_interrupt_in { 9434c82456eSMiklos Szeredi uint64_t unique; 944607ca46eSDavid Howells }; 945607ca46eSDavid Howells 946607ca46eSDavid Howells struct fuse_bmap_in { 9474c82456eSMiklos Szeredi uint64_t block; 9484c82456eSMiklos Szeredi uint32_t blocksize; 9494c82456eSMiklos Szeredi uint32_t padding; 950607ca46eSDavid Howells }; 951607ca46eSDavid Howells 952607ca46eSDavid Howells struct fuse_bmap_out { 9534c82456eSMiklos Szeredi uint64_t block; 954607ca46eSDavid Howells }; 955607ca46eSDavid Howells 956607ca46eSDavid Howells struct fuse_ioctl_in { 9574c82456eSMiklos Szeredi uint64_t fh; 9584c82456eSMiklos Szeredi uint32_t flags; 9594c82456eSMiklos Szeredi uint32_t cmd; 9604c82456eSMiklos Szeredi uint64_t arg; 9614c82456eSMiklos Szeredi uint32_t in_size; 9624c82456eSMiklos Szeredi uint32_t out_size; 963607ca46eSDavid Howells }; 964607ca46eSDavid Howells 965607ca46eSDavid Howells struct fuse_ioctl_iovec { 9664c82456eSMiklos Szeredi uint64_t base; 9674c82456eSMiklos Szeredi uint64_t len; 968607ca46eSDavid Howells }; 969607ca46eSDavid Howells 970607ca46eSDavid Howells struct fuse_ioctl_out { 9714c82456eSMiklos Szeredi int32_t result; 9724c82456eSMiklos Szeredi uint32_t flags; 9734c82456eSMiklos Szeredi uint32_t in_iovs; 9744c82456eSMiklos Szeredi uint32_t out_iovs; 975607ca46eSDavid Howells }; 976607ca46eSDavid Howells 977607ca46eSDavid Howells struct fuse_poll_in { 9784c82456eSMiklos Szeredi uint64_t fh; 9794c82456eSMiklos Szeredi uint64_t kh; 9804c82456eSMiklos Szeredi uint32_t flags; 9814c82456eSMiklos Szeredi uint32_t events; 982607ca46eSDavid Howells }; 983607ca46eSDavid Howells 984607ca46eSDavid Howells struct fuse_poll_out { 9854c82456eSMiklos Szeredi uint32_t revents; 9864c82456eSMiklos Szeredi uint32_t padding; 987607ca46eSDavid Howells }; 988607ca46eSDavid Howells 989607ca46eSDavid Howells struct fuse_notify_poll_wakeup_out { 9904c82456eSMiklos Szeredi uint64_t kh; 991607ca46eSDavid Howells }; 992607ca46eSDavid Howells 993607ca46eSDavid Howells struct fuse_fallocate_in { 9944c82456eSMiklos Szeredi uint64_t fh; 9954c82456eSMiklos Szeredi uint64_t offset; 9964c82456eSMiklos Szeredi uint64_t length; 9974c82456eSMiklos Szeredi uint32_t mode; 9984c82456eSMiklos Szeredi uint32_t padding; 999607ca46eSDavid Howells }; 1000607ca46eSDavid Howells 10019e7f5296SZhao Chen /** 10029e7f5296SZhao Chen * FUSE request unique ID flag 10039e7f5296SZhao Chen * 10049e7f5296SZhao Chen * Indicates whether this is a resend request. The receiver should handle this 10059e7f5296SZhao Chen * request accordingly. 10069e7f5296SZhao Chen */ 10079e7f5296SZhao Chen #define FUSE_UNIQUE_RESEND (1ULL << 63) 10089e7f5296SZhao Chen 100916e1503eSAlexander Mikhalitsyn /** 101016e1503eSAlexander Mikhalitsyn * This value will be set by the kernel to 101116e1503eSAlexander Mikhalitsyn * (struct fuse_in_header).{uid,gid} fields in 101216e1503eSAlexander Mikhalitsyn * case when: 101316e1503eSAlexander Mikhalitsyn * - fuse daemon enabled FUSE_ALLOW_IDMAP 101416e1503eSAlexander Mikhalitsyn * - idmapping information is not available and uid/gid 101516e1503eSAlexander Mikhalitsyn * can not be mapped in accordance with an idmapping. 101616e1503eSAlexander Mikhalitsyn * 101716e1503eSAlexander Mikhalitsyn * Note: an idmapping information always available 101816e1503eSAlexander Mikhalitsyn * for inode creation operations like: 101916e1503eSAlexander Mikhalitsyn * FUSE_MKNOD, FUSE_SYMLINK, FUSE_MKDIR, FUSE_TMPFILE, 102016e1503eSAlexander Mikhalitsyn * FUSE_CREATE and FUSE_RENAME2 (with RENAME_WHITEOUT). 102116e1503eSAlexander Mikhalitsyn */ 1022aa16880dSAlexander Mikhalitsyn #define FUSE_INVALID_UIDGID ((uint32_t)(-1)) 1023aa16880dSAlexander Mikhalitsyn 1024607ca46eSDavid Howells struct fuse_in_header { 10254c82456eSMiklos Szeredi uint32_t len; 10264c82456eSMiklos Szeredi uint32_t opcode; 10274c82456eSMiklos Szeredi uint64_t unique; 10284c82456eSMiklos Szeredi uint64_t nodeid; 10294c82456eSMiklos Szeredi uint32_t uid; 10304c82456eSMiklos Szeredi uint32_t gid; 10314c82456eSMiklos Szeredi uint32_t pid; 103215d937d7SMiklos Szeredi uint16_t total_extlen; /* length of extensions in 8byte units */ 103315d937d7SMiklos Szeredi uint16_t padding; 1034607ca46eSDavid Howells }; 1035607ca46eSDavid Howells 1036607ca46eSDavid Howells struct fuse_out_header { 10374c82456eSMiklos Szeredi uint32_t len; 10384c82456eSMiklos Szeredi int32_t error; 10394c82456eSMiklos Szeredi uint64_t unique; 1040607ca46eSDavid Howells }; 1041607ca46eSDavid Howells 1042607ca46eSDavid Howells struct fuse_dirent { 10434c82456eSMiklos Szeredi uint64_t ino; 10444c82456eSMiklos Szeredi uint64_t off; 10454c82456eSMiklos Szeredi uint32_t namelen; 10464c82456eSMiklos Szeredi uint32_t type; 1047607ca46eSDavid Howells char name[]; 1048607ca46eSDavid Howells }; 1049607ca46eSDavid Howells 10503e2b6fdbSVivek Goyal /* Align variable length records to 64bit boundary */ 10513e2b6fdbSVivek Goyal #define FUSE_REC_ALIGN(x) \ 10524c82456eSMiklos Szeredi (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1)) 10533e2b6fdbSVivek Goyal 10543e2b6fdbSVivek Goyal #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) 10553e2b6fdbSVivek Goyal #define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x) 1056607ca46eSDavid Howells #define FUSE_DIRENT_SIZE(d) \ 1057607ca46eSDavid Howells FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) 1058607ca46eSDavid Howells 10590b05b183SAnand V. Avati struct fuse_direntplus { 10600b05b183SAnand V. Avati struct fuse_entry_out entry_out; 10610b05b183SAnand V. Avati struct fuse_dirent dirent; 10620b05b183SAnand V. Avati }; 10630b05b183SAnand V. Avati 10640b05b183SAnand V. Avati #define FUSE_NAME_OFFSET_DIRENTPLUS \ 10650b05b183SAnand V. Avati offsetof(struct fuse_direntplus, dirent.name) 10660b05b183SAnand V. Avati #define FUSE_DIRENTPLUS_SIZE(d) \ 10670b05b183SAnand V. Avati FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen) 10680b05b183SAnand V. Avati 1069607ca46eSDavid Howells struct fuse_notify_inval_inode_out { 10704c82456eSMiklos Szeredi uint64_t ino; 10714c82456eSMiklos Szeredi int64_t off; 10724c82456eSMiklos Szeredi int64_t len; 1073607ca46eSDavid Howells }; 1074607ca46eSDavid Howells 1075607ca46eSDavid Howells struct fuse_notify_inval_entry_out { 10764c82456eSMiklos Szeredi uint64_t parent; 10774c82456eSMiklos Szeredi uint32_t namelen; 10784f8d3702SMiklos Szeredi uint32_t flags; 1079607ca46eSDavid Howells }; 1080607ca46eSDavid Howells 1081607ca46eSDavid Howells struct fuse_notify_delete_out { 10824c82456eSMiklos Szeredi uint64_t parent; 10834c82456eSMiklos Szeredi uint64_t child; 10844c82456eSMiklos Szeredi uint32_t namelen; 10854c82456eSMiklos Szeredi uint32_t padding; 1086607ca46eSDavid Howells }; 1087607ca46eSDavid Howells 1088607ca46eSDavid Howells struct fuse_notify_store_out { 10894c82456eSMiklos Szeredi uint64_t nodeid; 10904c82456eSMiklos Szeredi uint64_t offset; 10914c82456eSMiklos Szeredi uint32_t size; 10924c82456eSMiklos Szeredi uint32_t padding; 1093607ca46eSDavid Howells }; 1094607ca46eSDavid Howells 1095607ca46eSDavid Howells struct fuse_notify_retrieve_out { 10964c82456eSMiklos Szeredi uint64_t notify_unique; 10974c82456eSMiklos Szeredi uint64_t nodeid; 10984c82456eSMiklos Szeredi uint64_t offset; 10994c82456eSMiklos Szeredi uint32_t size; 11004c82456eSMiklos Szeredi uint32_t padding; 1101607ca46eSDavid Howells }; 1102607ca46eSDavid Howells 1103607ca46eSDavid Howells /* Matches the size of fuse_write_in */ 1104607ca46eSDavid Howells struct fuse_notify_retrieve_in { 11054c82456eSMiklos Szeredi uint64_t dummy1; 11064c82456eSMiklos Szeredi uint64_t offset; 11074c82456eSMiklos Szeredi uint32_t size; 11084c82456eSMiklos Szeredi uint32_t dummy2; 11094c82456eSMiklos Szeredi uint64_t dummy3; 11104c82456eSMiklos Szeredi uint64_t dummy4; 1111607ca46eSDavid Howells }; 1112607ca46eSDavid Howells 111344350256SAmir Goldstein struct fuse_backing_map { 111444350256SAmir Goldstein int32_t fd; 111544350256SAmir Goldstein uint32_t flags; 111644350256SAmir Goldstein uint64_t padding; 111744350256SAmir Goldstein }; 111844350256SAmir Goldstein 111900c570f4SMiklos Szeredi /* Device ioctls: */ 1120f8425c93SAlessio Balsini #define FUSE_DEV_IOC_MAGIC 229 1121f8425c93SAlessio Balsini #define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t) 112244350256SAmir Goldstein #define FUSE_DEV_IOC_BACKING_OPEN _IOW(FUSE_DEV_IOC_MAGIC, 1, \ 112344350256SAmir Goldstein struct fuse_backing_map) 112444350256SAmir Goldstein #define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, uint32_t) 112500c570f4SMiklos Szeredi 11260b5da8dbSRavishankar N struct fuse_lseek_in { 11270b5da8dbSRavishankar N uint64_t fh; 11280b5da8dbSRavishankar N uint64_t offset; 11290b5da8dbSRavishankar N uint32_t whence; 11300b5da8dbSRavishankar N uint32_t padding; 11310b5da8dbSRavishankar N }; 11320b5da8dbSRavishankar N 11330b5da8dbSRavishankar N struct fuse_lseek_out { 11340b5da8dbSRavishankar N uint64_t offset; 11350b5da8dbSRavishankar N }; 11360b5da8dbSRavishankar N 113788bc7d50SNiels de Vos struct fuse_copy_file_range_in { 113888bc7d50SNiels de Vos uint64_t fh_in; 113988bc7d50SNiels de Vos uint64_t off_in; 114088bc7d50SNiels de Vos uint64_t nodeid_out; 114188bc7d50SNiels de Vos uint64_t fh_out; 114288bc7d50SNiels de Vos uint64_t off_out; 114388bc7d50SNiels de Vos uint64_t len; 114488bc7d50SNiels de Vos uint64_t flags; 114588bc7d50SNiels de Vos }; 114688bc7d50SNiels de Vos 1147ceec02d4SVivek Goyal #define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0) 1148c2d0ad00SVivek Goyal #define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1) 1149ceec02d4SVivek Goyal struct fuse_setupmapping_in { 1150ceec02d4SVivek Goyal /* An already open handle */ 1151ceec02d4SVivek Goyal uint64_t fh; 1152ceec02d4SVivek Goyal /* Offset into the file to start the mapping */ 1153ceec02d4SVivek Goyal uint64_t foffset; 1154ceec02d4SVivek Goyal /* Length of mapping required */ 1155ceec02d4SVivek Goyal uint64_t len; 1156ceec02d4SVivek Goyal /* Flags, FUSE_SETUPMAPPING_FLAG_* */ 1157ceec02d4SVivek Goyal uint64_t flags; 1158ceec02d4SVivek Goyal /* Offset in Memory Window */ 1159ceec02d4SVivek Goyal uint64_t moffset; 1160ceec02d4SVivek Goyal }; 1161ceec02d4SVivek Goyal 1162ceec02d4SVivek Goyal struct fuse_removemapping_in { 1163ceec02d4SVivek Goyal /* number of fuse_removemapping_one follows */ 1164ceec02d4SVivek Goyal uint32_t count; 1165ceec02d4SVivek Goyal }; 1166ceec02d4SVivek Goyal 1167ceec02d4SVivek Goyal struct fuse_removemapping_one { 1168ceec02d4SVivek Goyal /* Offset into the dax window start the unmapping */ 1169ceec02d4SVivek Goyal uint64_t moffset; 1170ceec02d4SVivek Goyal /* Length of mapping required */ 1171ceec02d4SVivek Goyal uint64_t len; 1172ceec02d4SVivek Goyal }; 1173ceec02d4SVivek Goyal 1174ceec02d4SVivek Goyal #define FUSE_REMOVEMAPPING_MAX_ENTRY \ 1175ceec02d4SVivek Goyal (PAGE_SIZE / sizeof(struct fuse_removemapping_one)) 1176ceec02d4SVivek Goyal 11772d82ab25SGreg Kurz struct fuse_syncfs_in { 11782d82ab25SGreg Kurz uint64_t padding; 11792d82ab25SGreg Kurz }; 11802d82ab25SGreg Kurz 11813e2b6fdbSVivek Goyal /* 11823e2b6fdbSVivek Goyal * For each security context, send fuse_secctx with size of security context 11833e2b6fdbSVivek Goyal * fuse_secctx will be followed by security context name and this in turn 11843e2b6fdbSVivek Goyal * will be followed by actual context label. 11853e2b6fdbSVivek Goyal * fuse_secctx, name, context 11863e2b6fdbSVivek Goyal */ 11873e2b6fdbSVivek Goyal struct fuse_secctx { 11883e2b6fdbSVivek Goyal uint32_t size; 11893e2b6fdbSVivek Goyal uint32_t padding; 11903e2b6fdbSVivek Goyal }; 11913e2b6fdbSVivek Goyal 11923e2b6fdbSVivek Goyal /* 11933e2b6fdbSVivek Goyal * Contains the information about how many fuse_secctx structures are being 11943e2b6fdbSVivek Goyal * sent and what's the total size of all security contexts (including 11953e2b6fdbSVivek Goyal * size of fuse_secctx_header). 11963e2b6fdbSVivek Goyal * 11973e2b6fdbSVivek Goyal */ 11983e2b6fdbSVivek Goyal struct fuse_secctx_header { 11993e2b6fdbSVivek Goyal uint32_t size; 12003e2b6fdbSVivek Goyal uint32_t nr_secctx; 12013e2b6fdbSVivek Goyal }; 12023e2b6fdbSVivek Goyal 120315d937d7SMiklos Szeredi /** 120415d937d7SMiklos Szeredi * struct fuse_ext_header - extension header 120515d937d7SMiklos Szeredi * @size: total size of this extension including this header 120615d937d7SMiklos Szeredi * @type: type of extension 120715d937d7SMiklos Szeredi * 120815d937d7SMiklos Szeredi * This is made compatible with fuse_secctx_header by using type values > 120915d937d7SMiklos Szeredi * FUSE_MAX_NR_SECCTX 121015d937d7SMiklos Szeredi */ 121115d937d7SMiklos Szeredi struct fuse_ext_header { 121215d937d7SMiklos Szeredi uint32_t size; 121315d937d7SMiklos Szeredi uint32_t type; 121415d937d7SMiklos Szeredi }; 121515d937d7SMiklos Szeredi 12168ed7cb3fSMiklos Szeredi /** 12178ed7cb3fSMiklos Szeredi * struct fuse_supp_groups - Supplementary group extension 12188ed7cb3fSMiklos Szeredi * @nr_groups: number of supplementary groups 12198ed7cb3fSMiklos Szeredi * @groups: flexible array of group IDs 12208ed7cb3fSMiklos Szeredi */ 12218ed7cb3fSMiklos Szeredi struct fuse_supp_groups { 12228ed7cb3fSMiklos Szeredi uint32_t nr_groups; 12238ed7cb3fSMiklos Szeredi uint32_t groups[]; 12248ed7cb3fSMiklos Szeredi }; 12258ed7cb3fSMiklos Szeredi 122624fe962cSBernd Schubert /** 122724fe962cSBernd Schubert * Size of the ring buffer header 122824fe962cSBernd Schubert */ 122924fe962cSBernd Schubert #define FUSE_URING_IN_OUT_HEADER_SZ 128 123024fe962cSBernd Schubert #define FUSE_URING_OP_IN_OUT_SZ 128 123124fe962cSBernd Schubert 123224fe962cSBernd Schubert /* Used as part of the fuse_uring_req_header */ 123324fe962cSBernd Schubert struct fuse_uring_ent_in_out { 123424fe962cSBernd Schubert uint64_t flags; 123524fe962cSBernd Schubert 123624fe962cSBernd Schubert /* 123724fe962cSBernd Schubert * commit ID to be used in a reply to a ring request (see also 123824fe962cSBernd Schubert * struct fuse_uring_cmd_req) 123924fe962cSBernd Schubert */ 124024fe962cSBernd Schubert uint64_t commit_id; 124124fe962cSBernd Schubert 124224fe962cSBernd Schubert /* size of user payload buffer */ 124324fe962cSBernd Schubert uint32_t payload_sz; 124424fe962cSBernd Schubert uint32_t padding; 124524fe962cSBernd Schubert 124624fe962cSBernd Schubert uint64_t reserved; 124724fe962cSBernd Schubert }; 124824fe962cSBernd Schubert 124924fe962cSBernd Schubert /** 125024fe962cSBernd Schubert * Header for all fuse-io-uring requests 125124fe962cSBernd Schubert */ 125224fe962cSBernd Schubert struct fuse_uring_req_header { 125324fe962cSBernd Schubert /* struct fuse_in_header / struct fuse_out_header */ 125424fe962cSBernd Schubert char in_out[FUSE_URING_IN_OUT_HEADER_SZ]; 125524fe962cSBernd Schubert 125624fe962cSBernd Schubert /* per op code header */ 125724fe962cSBernd Schubert char op_in[FUSE_URING_OP_IN_OUT_SZ]; 125824fe962cSBernd Schubert 125924fe962cSBernd Schubert struct fuse_uring_ent_in_out ring_ent_in_out; 126024fe962cSBernd Schubert }; 126124fe962cSBernd Schubert 126224fe962cSBernd Schubert /** 126324fe962cSBernd Schubert * sqe commands to the kernel 126424fe962cSBernd Schubert */ 126524fe962cSBernd Schubert enum fuse_uring_cmd { 126624fe962cSBernd Schubert FUSE_IO_URING_CMD_INVALID = 0, 126724fe962cSBernd Schubert 126824fe962cSBernd Schubert /* register the request buffer and fetch a fuse request */ 126924fe962cSBernd Schubert FUSE_IO_URING_CMD_REGISTER = 1, 127024fe962cSBernd Schubert 127124fe962cSBernd Schubert /* commit fuse request result and fetch next request */ 127224fe962cSBernd Schubert FUSE_IO_URING_CMD_COMMIT_AND_FETCH = 2, 127324fe962cSBernd Schubert }; 127424fe962cSBernd Schubert 127524fe962cSBernd Schubert /** 127624fe962cSBernd Schubert * In the 80B command area of the SQE. 127724fe962cSBernd Schubert */ 127824fe962cSBernd Schubert struct fuse_uring_cmd_req { 127924fe962cSBernd Schubert uint64_t flags; 128024fe962cSBernd Schubert 128124fe962cSBernd Schubert /* entry identifier for commits */ 128224fe962cSBernd Schubert uint64_t commit_id; 128324fe962cSBernd Schubert 128424fe962cSBernd Schubert /* queue the command is for (queue index) */ 128524fe962cSBernd Schubert uint16_t qid; 128624fe962cSBernd Schubert uint8_t padding[6]; 128724fe962cSBernd Schubert }; 128824fe962cSBernd Schubert 1289607ca46eSDavid Howells #endif /* _LINUX_FUSE_H */ 1290