1/* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2006 Miklos Szeredi <miklos@szeredi.hu> 4 5 This program can be distributed under the terms of the GNU GPL. 6 See the file COPYING. 7*/ 8 9/* This file defines the kernel interface of FUSE */ 10 11#include <asm/types.h> 12#include <linux/major.h> 13 14/** Version number of this interface */ 15#define FUSE_KERNEL_VERSION 7 16 17/** Minor version number of this interface */ 18#define FUSE_KERNEL_MINOR_VERSION 8 19 20/** The node ID of the root inode */ 21#define FUSE_ROOT_ID 1 22 23/** The major number of the fuse character device */ 24#define FUSE_MAJOR MISC_MAJOR 25 26/** The minor number of the fuse character device */ 27#define FUSE_MINOR 229 28 29/* Make sure all structures are padded to 64bit boundary, so 32bit 30 userspace works under 64bit kernels */ 31 32struct fuse_attr { 33 __u64 ino; 34 __u64 size; 35 __u64 blocks; 36 __u64 atime; 37 __u64 mtime; 38 __u64 ctime; 39 __u32 atimensec; 40 __u32 mtimensec; 41 __u32 ctimensec; 42 __u32 mode; 43 __u32 nlink; 44 __u32 uid; 45 __u32 gid; 46 __u32 rdev; 47}; 48 49struct fuse_kstatfs { 50 __u64 blocks; 51 __u64 bfree; 52 __u64 bavail; 53 __u64 files; 54 __u64 ffree; 55 __u32 bsize; 56 __u32 namelen; 57 __u32 frsize; 58 __u32 padding; 59 __u32 spare[6]; 60}; 61 62struct fuse_file_lock { 63 __u64 start; 64 __u64 end; 65 __u32 type; 66 __u32 pid; /* tgid */ 67}; 68 69/** 70 * Bitmasks for fuse_setattr_in.valid 71 */ 72#define FATTR_MODE (1 << 0) 73#define FATTR_UID (1 << 1) 74#define FATTR_GID (1 << 2) 75#define FATTR_SIZE (1 << 3) 76#define FATTR_ATIME (1 << 4) 77#define FATTR_MTIME (1 << 5) 78#define FATTR_FH (1 << 6) 79 80/** 81 * Flags returned by the OPEN request 82 * 83 * FOPEN_DIRECT_IO: bypass page cache for this open file 84 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open 85 */ 86#define FOPEN_DIRECT_IO (1 << 0) 87#define FOPEN_KEEP_CACHE (1 << 1) 88 89/** 90 * INIT request/reply flags 91 */ 92#define FUSE_ASYNC_READ (1 << 0) 93#define FUSE_POSIX_LOCKS (1 << 1) 94 95/** 96 * Release flags 97 */ 98#define FUSE_RELEASE_FLUSH (1 << 0) 99 100enum fuse_opcode { 101 FUSE_LOOKUP = 1, 102 FUSE_FORGET = 2, /* no reply */ 103 FUSE_GETATTR = 3, 104 FUSE_SETATTR = 4, 105 FUSE_READLINK = 5, 106 FUSE_SYMLINK = 6, 107 FUSE_MKNOD = 8, 108 FUSE_MKDIR = 9, 109 FUSE_UNLINK = 10, 110 FUSE_RMDIR = 11, 111 FUSE_RENAME = 12, 112 FUSE_LINK = 13, 113 FUSE_OPEN = 14, 114 FUSE_READ = 15, 115 FUSE_WRITE = 16, 116 FUSE_STATFS = 17, 117 FUSE_RELEASE = 18, 118 FUSE_FSYNC = 20, 119 FUSE_SETXATTR = 21, 120 FUSE_GETXATTR = 22, 121 FUSE_LISTXATTR = 23, 122 FUSE_REMOVEXATTR = 24, 123 FUSE_FLUSH = 25, 124 FUSE_INIT = 26, 125 FUSE_OPENDIR = 27, 126 FUSE_READDIR = 28, 127 FUSE_RELEASEDIR = 29, 128 FUSE_FSYNCDIR = 30, 129 FUSE_GETLK = 31, 130 FUSE_SETLK = 32, 131 FUSE_SETLKW = 33, 132 FUSE_ACCESS = 34, 133 FUSE_CREATE = 35, 134 FUSE_INTERRUPT = 36, 135 FUSE_BMAP = 37, 136 FUSE_DESTROY = 38, 137}; 138 139/* The read buffer is required to be at least 8k, but may be much larger */ 140#define FUSE_MIN_READ_BUFFER 8192 141 142struct fuse_entry_out { 143 __u64 nodeid; /* Inode ID */ 144 __u64 generation; /* Inode generation: nodeid:gen must 145 be unique for the fs's lifetime */ 146 __u64 entry_valid; /* Cache timeout for the name */ 147 __u64 attr_valid; /* Cache timeout for the attributes */ 148 __u32 entry_valid_nsec; 149 __u32 attr_valid_nsec; 150 struct fuse_attr attr; 151}; 152 153struct fuse_forget_in { 154 __u64 nlookup; 155}; 156 157struct fuse_attr_out { 158 __u64 attr_valid; /* Cache timeout for the attributes */ 159 __u32 attr_valid_nsec; 160 __u32 dummy; 161 struct fuse_attr attr; 162}; 163 164struct fuse_mknod_in { 165 __u32 mode; 166 __u32 rdev; 167}; 168 169struct fuse_mkdir_in { 170 __u32 mode; 171 __u32 padding; 172}; 173 174struct fuse_rename_in { 175 __u64 newdir; 176}; 177 178struct fuse_link_in { 179 __u64 oldnodeid; 180}; 181 182struct fuse_setattr_in { 183 __u32 valid; 184 __u32 padding; 185 __u64 fh; 186 __u64 size; 187 __u64 unused1; 188 __u64 atime; 189 __u64 mtime; 190 __u64 unused2; 191 __u32 atimensec; 192 __u32 mtimensec; 193 __u32 unused3; 194 __u32 mode; 195 __u32 unused4; 196 __u32 uid; 197 __u32 gid; 198 __u32 unused5; 199}; 200 201struct fuse_open_in { 202 __u32 flags; 203 __u32 mode; 204}; 205 206struct fuse_open_out { 207 __u64 fh; 208 __u32 open_flags; 209 __u32 padding; 210}; 211 212struct fuse_release_in { 213 __u64 fh; 214 __u32 flags; 215 __u32 release_flags; 216 __u64 lock_owner; 217}; 218 219struct fuse_flush_in { 220 __u64 fh; 221 __u32 unused; 222 __u32 padding; 223 __u64 lock_owner; 224}; 225 226struct fuse_read_in { 227 __u64 fh; 228 __u64 offset; 229 __u32 size; 230 __u32 padding; 231}; 232 233struct fuse_write_in { 234 __u64 fh; 235 __u64 offset; 236 __u32 size; 237 __u32 write_flags; 238}; 239 240struct fuse_write_out { 241 __u32 size; 242 __u32 padding; 243}; 244 245#define FUSE_COMPAT_STATFS_SIZE 48 246 247struct fuse_statfs_out { 248 struct fuse_kstatfs st; 249}; 250 251struct fuse_fsync_in { 252 __u64 fh; 253 __u32 fsync_flags; 254 __u32 padding; 255}; 256 257struct fuse_setxattr_in { 258 __u32 size; 259 __u32 flags; 260}; 261 262struct fuse_getxattr_in { 263 __u32 size; 264 __u32 padding; 265}; 266 267struct fuse_getxattr_out { 268 __u32 size; 269 __u32 padding; 270}; 271 272struct fuse_lk_in { 273 __u64 fh; 274 __u64 owner; 275 struct fuse_file_lock lk; 276}; 277 278struct fuse_lk_out { 279 struct fuse_file_lock lk; 280}; 281 282struct fuse_access_in { 283 __u32 mask; 284 __u32 padding; 285}; 286 287struct fuse_init_in { 288 __u32 major; 289 __u32 minor; 290 __u32 max_readahead; 291 __u32 flags; 292}; 293 294struct fuse_init_out { 295 __u32 major; 296 __u32 minor; 297 __u32 max_readahead; 298 __u32 flags; 299 __u32 unused; 300 __u32 max_write; 301}; 302 303struct fuse_interrupt_in { 304 __u64 unique; 305}; 306 307struct fuse_bmap_in { 308 __u64 block; 309 __u32 blocksize; 310 __u32 padding; 311}; 312 313struct fuse_bmap_out { 314 __u64 block; 315}; 316 317struct fuse_in_header { 318 __u32 len; 319 __u32 opcode; 320 __u64 unique; 321 __u64 nodeid; 322 __u32 uid; 323 __u32 gid; 324 __u32 pid; 325 __u32 padding; 326}; 327 328struct fuse_out_header { 329 __u32 len; 330 __s32 error; 331 __u64 unique; 332}; 333 334struct fuse_dirent { 335 __u64 ino; 336 __u64 off; 337 __u32 namelen; 338 __u32 type; 339 char name[0]; 340}; 341 342#define FUSE_NAME_OFFSET ((unsigned) ((struct fuse_dirent *) 0)->name) 343#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) 344#define FUSE_DIRENT_SIZE(d) \ 345 FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) 346