fuse_kernel.h revision 253276
1217044Snwhitehorn/*- 2217044Snwhitehorn * This file defines the kernel interface of FUSE 3223313Snwhitehorn * Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu> 4217044Snwhitehorn * 5217044Snwhitehorn * This program can be distributed under the terms of the GNU GPL. 6217044Snwhitehorn * See the file COPYING. 7217044Snwhitehorn * 8217044Snwhitehorn * This -- and only this -- header file may also be distributed under 9217044Snwhitehorn * the terms of the BSD Licence as follows: 10217044Snwhitehorn * 11217044Snwhitehorn * Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. 12217044Snwhitehorn * 13217044Snwhitehorn * Redistribution and use in source and binary forms, with or without 14217044Snwhitehorn * modification, are permitted provided that the following conditions 15217044Snwhitehorn * are met: 16217044Snwhitehorn * 1. Redistributions of source code must retain the above copyright 17217044Snwhitehorn * notice, this list of conditions and the following disclaimer. 18217044Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 19217044Snwhitehorn * notice, this list of conditions and the following disclaimer in the 20217044Snwhitehorn * documentation and/or other materials provided with the distribution. 21217044Snwhitehorn * 22217044Snwhitehorn * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23217044Snwhitehorn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24217044Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25217044Snwhitehorn * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 26217044Snwhitehorn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27227843Smarius * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28227843Smarius * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29227843Smarius * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30217044Snwhitehorn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31217044Snwhitehorn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32217044Snwhitehorn * SUCH DAMAGE. 33217044Snwhitehorn * 34217044Snwhitehorn * $FreeBSD: head/sys/fs/fuse/fuse_kernel.h 253276 2013-07-12 17:22:59Z pfg $ 35217044Snwhitehorn */ 36222239Snwhitehorn 37217044Snwhitehorn#ifndef linux 38217044Snwhitehorn#include <sys/types.h> 39217044Snwhitehorn#define __u64 uint64_t 40217044Snwhitehorn#define __u32 uint32_t 41217044Snwhitehorn#define __s32 int32_t 42217044Snwhitehorn#else 43217044Snwhitehorn#include <asm/types.h> 44217044Snwhitehorn#include <linux/major.h> 45217044Snwhitehorn#endif 46217044Snwhitehorn 47217044Snwhitehorn/** Version number of this interface */ 48217044Snwhitehorn#define FUSE_KERNEL_VERSION 7 49217044Snwhitehorn 50217044Snwhitehorn/** Minor version number of this interface */ 51222239Snwhitehorn#define FUSE_KERNEL_MINOR_VERSION 8 52217044Snwhitehorn 53217044Snwhitehorn/** The node ID of the root inode */ 54217044Snwhitehorn#define FUSE_ROOT_ID 1 55217044Snwhitehorn 56217044Snwhitehorn/** The major number of the fuse character device */ 57217044Snwhitehorn#define FUSE_MAJOR MISC_MAJOR 58217044Snwhitehorn 59217044Snwhitehorn/** The minor number of the fuse character device */ 60295673Sjhibbits#define FUSE_MINOR 229 61295673Sjhibbits 62217044Snwhitehorn/* Make sure all structures are padded to 64bit boundary, so 32bit 63217044Snwhitehorn userspace works under 64bit kernels */ 64217044Snwhitehorn 65217044Snwhitehornstruct fuse_attr { 66232356Sjhb __u64 ino; 67217044Snwhitehorn __u64 size; 68217044Snwhitehorn __u64 blocks; 69222239Snwhitehorn __u64 atime; 70222239Snwhitehorn __u64 mtime; 71217044Snwhitehorn __u64 ctime; 72217044Snwhitehorn#ifdef __FreeBSD__ 73217044Snwhitehorn __u64 crtime; 74217044Snwhitehorn#endif 75217044Snwhitehorn __u32 atimensec; 76217044Snwhitehorn __u32 mtimensec; 77223313Snwhitehorn __u32 ctimensec; 78223313Snwhitehorn#ifdef __FreeBSD__ 79217044Snwhitehorn __u32 crtimensec; 80217044Snwhitehorn#endif 81217044Snwhitehorn __u32 mode; 82217044Snwhitehorn __u32 nlink; 83217044Snwhitehorn __u32 uid; 84217044Snwhitehorn __u32 gid; 85217044Snwhitehorn __u32 rdev; 86217044Snwhitehorn}; 87217044Snwhitehorn 88217044Snwhitehornstruct fuse_kstatfs { 89217044Snwhitehorn __u64 blocks; 90217044Snwhitehorn __u64 bfree; 91217044Snwhitehorn __u64 bavail; 92217044Snwhitehorn __u64 files; 93217044Snwhitehorn __u64 ffree; 94217044Snwhitehorn __u32 bsize; 95223313Snwhitehorn __u32 namelen; 96223313Snwhitehorn __u32 frsize; 97223313Snwhitehorn __u32 padding; 98223313Snwhitehorn __u32 spare[6]; 99223313Snwhitehorn}; 100217044Snwhitehorn 101217044Snwhitehornstruct fuse_file_lock { 102217044Snwhitehorn __u64 start; 103217044Snwhitehorn __u64 end; 104217044Snwhitehorn __u32 type; 105217044Snwhitehorn __u32 pid; /* tgid */ 106217044Snwhitehorn}; 107217044Snwhitehorn 108217044Snwhitehorn/** 109217044Snwhitehorn * Bitmasks for fuse_setattr_in.valid 110217044Snwhitehorn */ 111217044Snwhitehorn#define FATTR_MODE (1 << 0) 112217044Snwhitehorn#define FATTR_UID (1 << 1) 113217044Snwhitehorn#define FATTR_GID (1 << 2) 114217044Snwhitehorn#define FATTR_SIZE (1 << 3) 115217044Snwhitehorn#define FATTR_ATIME (1 << 4) 116217044Snwhitehorn#define FATTR_MTIME (1 << 5) 117217044Snwhitehorn#define FATTR_FH (1 << 6) 118217044Snwhitehorn 119217044Snwhitehorn/** 120222239Snwhitehorn * Flags returned by the OPEN request 121222239Snwhitehorn * 122222239Snwhitehorn * FOPEN_DIRECT_IO: bypass page cache for this open file 123222239Snwhitehorn * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 124227843Smarius */ 125217044Snwhitehorn#define FOPEN_DIRECT_IO (1 << 0) 126217044Snwhitehorn#define FOPEN_KEEP_CACHE (1 << 1) 127217044Snwhitehorn 128217044Snwhitehorn/** 129265883Snwhitehorn * INIT request/reply flags 130217044Snwhitehorn */ 131217044Snwhitehorn#define FUSE_ASYNC_READ (1 << 0) 132217044Snwhitehorn#define FUSE_POSIX_LOCKS (1 << 1) 133217044Snwhitehorn 134217044Snwhitehorn/** 135217044Snwhitehorn * Release flags 136217044Snwhitehorn */ 137217044Snwhitehorn#define FUSE_RELEASE_FLUSH (1 << 0) 138217044Snwhitehorn 139217044Snwhitehornenum fuse_opcode { 140217044Snwhitehorn FUSE_LOOKUP = 1, 141217044Snwhitehorn FUSE_FORGET = 2, /* no reply */ 142217044Snwhitehorn FUSE_GETATTR = 3, 143217044Snwhitehorn FUSE_SETATTR = 4, 144217044Snwhitehorn FUSE_READLINK = 5, 145217044Snwhitehorn FUSE_SYMLINK = 6, 146217044Snwhitehorn FUSE_MKNOD = 8, 147217044Snwhitehorn FUSE_MKDIR = 9, 148217044Snwhitehorn FUSE_UNLINK = 10, 149217044Snwhitehorn FUSE_RMDIR = 11, 150217044Snwhitehorn FUSE_RENAME = 12, 151217044Snwhitehorn FUSE_LINK = 13, 152217044Snwhitehorn FUSE_OPEN = 14, 153217044Snwhitehorn FUSE_READ = 15, 154217044Snwhitehorn FUSE_WRITE = 16, 155217044Snwhitehorn FUSE_STATFS = 17, 156217044Snwhitehorn FUSE_RELEASE = 18, 157217044Snwhitehorn FUSE_FSYNC = 20, 158217044Snwhitehorn FUSE_SETXATTR = 21, 159217044Snwhitehorn FUSE_GETXATTR = 22, 160217044Snwhitehorn FUSE_LISTXATTR = 23, 161217044Snwhitehorn FUSE_REMOVEXATTR = 24, 162217044Snwhitehorn FUSE_FLUSH = 25, 163217044Snwhitehorn FUSE_INIT = 26, 164217044Snwhitehorn FUSE_OPENDIR = 27, 165217044Snwhitehorn FUSE_READDIR = 28, 166217044Snwhitehorn FUSE_RELEASEDIR = 29, 167217044Snwhitehorn FUSE_FSYNCDIR = 30, 168217044Snwhitehorn FUSE_GETLK = 31, 169217044Snwhitehorn FUSE_SETLK = 32, 170217044Snwhitehorn FUSE_SETLKW = 33, 171217044Snwhitehorn FUSE_ACCESS = 34, 172217044Snwhitehorn FUSE_CREATE = 35, 173217044Snwhitehorn FUSE_INTERRUPT = 36, 174217044Snwhitehorn FUSE_BMAP = 37, 175217044Snwhitehorn FUSE_DESTROY = 38, 176217044Snwhitehorn}; 177217044Snwhitehorn 178217044Snwhitehorn/* The read buffer is required to be at least 8k, but may be much larger */ 179217044Snwhitehorn#define FUSE_MIN_READ_BUFFER 8192 180217044Snwhitehorn 181217044Snwhitehornstruct fuse_entry_out { 182217044Snwhitehorn __u64 nodeid; /* Inode ID */ 183217044Snwhitehorn __u64 generation; /* Inode generation: nodeid:gen must 184217044Snwhitehorn be unique for the fs's lifetime */ 185217044Snwhitehorn __u64 entry_valid; /* Cache timeout for the name */ 186217044Snwhitehorn __u64 attr_valid; /* Cache timeout for the attributes */ 187217044Snwhitehorn __u32 entry_valid_nsec; 188217044Snwhitehorn __u32 attr_valid_nsec; 189217044Snwhitehorn struct fuse_attr attr; 190217044Snwhitehorn}; 191217044Snwhitehorn 192217044Snwhitehornstruct fuse_forget_in { 193217044Snwhitehorn __u64 nlookup; 194217044Snwhitehorn}; 195217044Snwhitehorn 196217044Snwhitehornstruct fuse_attr_out { 197217044Snwhitehorn __u64 attr_valid; /* Cache timeout for the attributes */ 198217044Snwhitehorn __u32 attr_valid_nsec; 199217044Snwhitehorn __u32 dummy; 200217044Snwhitehorn struct fuse_attr attr; 201217044Snwhitehorn}; 202217044Snwhitehorn 203217044Snwhitehornstruct fuse_mkdir_in { 204217044Snwhitehorn __u32 mode; 205217044Snwhitehorn __u32 padding; 206217044Snwhitehorn}; 207217044Snwhitehorn 208217044Snwhitehornstruct fuse_rename_in { 209217044Snwhitehorn __u64 newdir; 210217044Snwhitehorn}; 211217044Snwhitehorn 212217044Snwhitehornstruct fuse_link_in { 213217044Snwhitehorn __u64 oldnodeid; 214217044Snwhitehorn}; 215217044Snwhitehorn 216217044Snwhitehornstruct fuse_setattr_in { 217217044Snwhitehorn __u32 valid; 218217044Snwhitehorn __u32 padding; 219217044Snwhitehorn __u64 fh; 220217044Snwhitehorn __u64 size; 221217044Snwhitehorn __u64 unused1; 222217044Snwhitehorn __u64 atime; 223217044Snwhitehorn __u64 mtime; 224217044Snwhitehorn __u64 unused2; 225217044Snwhitehorn __u32 atimensec; 226217044Snwhitehorn __u32 mtimensec; 227217044Snwhitehorn __u32 unused3; 228217044Snwhitehorn __u32 mode; 229217044Snwhitehorn __u32 unused4; 230217044Snwhitehorn __u32 uid; 231217044Snwhitehorn __u32 gid; 232217044Snwhitehorn __u32 unused5; 233217044Snwhitehorn}; 234217044Snwhitehorn 235217044Snwhitehornstruct fuse_open_in { 236217044Snwhitehorn __u32 flags; 237217044Snwhitehorn __u32 mode; 238217044Snwhitehorn}; 239217044Snwhitehorn 240217044Snwhitehornstruct fuse_open_out { 241217044Snwhitehorn __u64 fh; 242217044Snwhitehorn __u32 open_flags; 243217044Snwhitehorn __u32 padding; 244217044Snwhitehorn}; 245217044Snwhitehorn 246223313Snwhitehornstruct fuse_release_in { 247223313Snwhitehorn __u64 fh; 248223313Snwhitehorn __u32 flags; 249223313Snwhitehorn __u32 release_flags; 250223313Snwhitehorn __u64 lock_owner; 251223313Snwhitehorn}; 252223313Snwhitehorn 253223313Snwhitehornstruct fuse_flush_in { 254223313Snwhitehorn __u64 fh; 255223313Snwhitehorn __u32 unused; 256223313Snwhitehorn __u32 padding; 257223313Snwhitehorn __u64 lock_owner; 258223313Snwhitehorn}; 259223313Snwhitehorn 260223313Snwhitehornstruct fuse_read_in { 261223313Snwhitehorn __u64 fh; 262223313Snwhitehorn __u64 offset; 263223313Snwhitehorn __u32 size; 264223313Snwhitehorn __u32 padding; 265223313Snwhitehorn}; 266223313Snwhitehorn 267223313Snwhitehornstruct fuse_write_in { 268223313Snwhitehorn __u64 fh; 269223313Snwhitehorn __u64 offset; 270223313Snwhitehorn __u32 size; 271223313Snwhitehorn __u32 write_flags; 272223313Snwhitehorn}; 273223313Snwhitehorn 274223313Snwhitehornstruct fuse_write_out { 275223313Snwhitehorn __u32 size; 276223313Snwhitehorn __u32 padding; 277223313Snwhitehorn}; 278223313Snwhitehorn 279223313Snwhitehorn#define FUSE_COMPAT_STATFS_SIZE 48 280223313Snwhitehorn 281223313Snwhitehornstruct fuse_statfs_out { 282223313Snwhitehorn struct fuse_kstatfs st; 283223313Snwhitehorn}; 284223313Snwhitehorn 285223313Snwhitehornstruct fuse_fsync_in { 286223313Snwhitehorn __u64 fh; 287223313Snwhitehorn __u32 fsync_flags; 288223313Snwhitehorn __u32 padding; 289223313Snwhitehorn}; 290223313Snwhitehorn 291223313Snwhitehornstruct fuse_setxattr_in { 292223313Snwhitehorn __u32 size; 293223313Snwhitehorn __u32 flags; 294223313Snwhitehorn}; 295223313Snwhitehorn 296223313Snwhitehornstruct fuse_getxattr_in { 297223313Snwhitehorn __u32 size; 298223313Snwhitehorn __u32 padding; 299223313Snwhitehorn}; 300223313Snwhitehorn 301223313Snwhitehornstruct fuse_getxattr_out { 302223313Snwhitehorn __u32 size; 303223313Snwhitehorn __u32 padding; 304223313Snwhitehorn}; 305223313Snwhitehorn 306223313Snwhitehornstruct fuse_lk_in { 307223313Snwhitehorn __u64 fh; 308223313Snwhitehorn __u64 owner; 309223313Snwhitehorn struct fuse_file_lock lk; 310223313Snwhitehorn}; 311223313Snwhitehorn 312223313Snwhitehornstruct fuse_lk_out { 313223313Snwhitehorn struct fuse_file_lock lk; 314223313Snwhitehorn}; 315223313Snwhitehorn 316223313Snwhitehornstruct fuse_access_in { 317217044Snwhitehorn __u32 mask; 318217044Snwhitehorn __u32 padding; 319217044Snwhitehorn}; 320217044Snwhitehorn 321217044Snwhitehornstruct fuse_init_in { 322217044Snwhitehorn __u32 major; 323217044Snwhitehorn __u32 minor; 324217044Snwhitehorn __u32 max_readahead; 325217044Snwhitehorn __u32 flags; 326217044Snwhitehorn}; 327217044Snwhitehorn 328217044Snwhitehornstruct fuse_init_out { 329217044Snwhitehorn __u32 major; 330217044Snwhitehorn __u32 minor; 331265883Snwhitehorn __u32 max_readahead; 332265883Snwhitehorn __u32 flags; 333217044Snwhitehorn __u32 unused; 334265883Snwhitehorn __u32 max_write; 335265883Snwhitehorn}; 336217044Snwhitehorn 337217044Snwhitehornstruct fuse_interrupt_in { 338217044Snwhitehorn __u64 unique; 339217044Snwhitehorn}; 340217044Snwhitehorn 341217044Snwhitehornstruct fuse_bmap_in { 342217044Snwhitehorn __u64 block; 343217044Snwhitehorn __u32 blocksize; 344217044Snwhitehorn __u32 padding; 345217044Snwhitehorn}; 346217044Snwhitehorn 347217044Snwhitehornstruct fuse_bmap_out { 348217044Snwhitehorn __u64 block; 349217044Snwhitehorn}; 350217044Snwhitehorn 351217044Snwhitehornstruct fuse_in_header { 352217044Snwhitehorn __u32 len; 353217044Snwhitehorn __u32 opcode; 354217044Snwhitehorn __u64 unique; 355217044Snwhitehorn __u64 nodeid; 356217044Snwhitehorn __u32 uid; 357217044Snwhitehorn __u32 gid; 358217044Snwhitehorn __u32 pid; 359217044Snwhitehorn __u32 padding; 360217044Snwhitehorn}; 361217044Snwhitehorn 362217044Snwhitehornstruct fuse_out_header { 363217044Snwhitehorn __u32 len; 364217044Snwhitehorn __s32 error; 365217044Snwhitehorn __u64 unique; 366217044Snwhitehorn}; 367217044Snwhitehorn 368217044Snwhitehornstruct fuse_dirent { 369217044Snwhitehorn __u64 ino; 370217044Snwhitehorn __u64 off; 371217044Snwhitehorn __u32 namelen; 372217044Snwhitehorn __u32 type; 373217044Snwhitehorn char name[0]; 374217044Snwhitehorn}; 375217044Snwhitehorn 376217044Snwhitehorn#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) 377217044Snwhitehorn#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) 378217044Snwhitehorn#define FUSE_DIRENT_SIZE(d) \ 379217044Snwhitehorn FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) 380223313Snwhitehorn