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