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