linux/include/linux/fuse.h
<<
>>
Prefs
   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 * 7.12
  30 *  - add umask flag to input argument of open, mknod and mkdir
  31 *  - add notification messages for invalidation of inodes and
  32 *    directory entries
  33 *
  34 * 7.13
  35 *  - make max number of background requests and congestion threshold
  36 *    tunables
  37 *
  38 * 7.14
  39 *  - add splice support to fuse device
  40 *
  41 * 7.15
  42 *  - add store notify
  43 *  - add retrieve notify
  44 *
  45 * 7.16
  46 *  - add BATCH_FORGET request
  47 *  - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct
  48 *    fuse_ioctl_iovec' instead of ambiguous 'struct iovec'
  49 *  - add FUSE_IOCTL_32BIT flag
  50 *
  51 * 7.17
  52 *  - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK
  53 *
  54 * 7.18
  55 *  - add FUSE_IOCTL_DIR flag
  56 *  - add FUSE_NOTIFY_DELETE
  57 *
  58 * 7.19
  59 *  - add FUSE_FALLOCATE
  60 *
  61 * 7.20
  62 *  - add FUSE_AUTO_INVAL_DATA
  63 */
  64
  65#ifndef _LINUX_FUSE_H
  66#define _LINUX_FUSE_H
  67
  68#include <linux/types.h>
  69
  70/*
  71 * Version negotiation:
  72 *
  73 * Both the kernel and userspace send the version they support in the
  74 * INIT request and reply respectively.
  75 *
  76 * If the major versions match then both shall use the smallest
  77 * of the two minor versions for communication.
  78 *
  79 * If the kernel supports a larger major version, then userspace shall
  80 * reply with the major version it supports, ignore the rest of the
  81 * INIT message and expect a new INIT message from the kernel with a
  82 * matching major version.
  83 *
  84 * If the library supports a larger major version, then it shall fall
  85 * back to the major protocol version sent by the kernel for
  86 * communication and reply with that major version (and an arbitrary
  87 * supported minor version).
  88 */
  89
  90/** Version number of this interface */
  91#define FUSE_KERNEL_VERSION 7
  92
  93/** Minor version number of this interface */
  94#define FUSE_KERNEL_MINOR_VERSION 20
  95
  96/** The node ID of the root inode */
  97#define FUSE_ROOT_ID 1
  98
  99/* Make sure all structures are padded to 64bit boundary, so 32bit
 100   userspace works under 64bit kernels */
 101
 102struct fuse_attr {
 103        __u64   ino;
 104        __u64   size;
 105        __u64   blocks;
 106        __u64   atime;
 107        __u64   mtime;
 108        __u64   ctime;
 109        __u32   atimensec;
 110        __u32   mtimensec;
 111        __u32   ctimensec;
 112        __u32   mode;
 113        __u32   nlink;
 114        __u32   uid;
 115        __u32   gid;
 116        __u32   rdev;
 117        __u32   blksize;
 118        __u32   padding;
 119};
 120
 121struct fuse_kstatfs {
 122        __u64   blocks;
 123        __u64   bfree;
 124        __u64   bavail;
 125        __u64   files;
 126        __u64   ffree;
 127        __u32   bsize;
 128        __u32   namelen;
 129        __u32   frsize;
 130        __u32   padding;
 131        __u32   spare[6];
 132};
 133
 134struct fuse_file_lock {
 135        __u64   start;
 136        __u64   end;
 137        __u32   type;
 138        __u32   pid; /* tgid */
 139};
 140
 141/**
 142 * Bitmasks for fuse_setattr_in.valid
 143 */
 144#define FATTR_MODE      (1 << 0)
 145#define FATTR_UID       (1 << 1)
 146#define FATTR_GID       (1 << 2)
 147#define FATTR_SIZE      (1 << 3)
 148#define FATTR_ATIME     (1 << 4)
 149#define FATTR_MTIME     (1 << 5)
 150#define FATTR_FH        (1 << 6)
 151#define FATTR_ATIME_NOW (1 << 7)
 152#define FATTR_MTIME_NOW (1 << 8)
 153#define FATTR_LOCKOWNER (1 << 9)
 154
 155/**
 156 * Flags returned by the OPEN request
 157 *
 158 * FOPEN_DIRECT_IO: bypass page cache for this open file
 159 * FOPEN_KEEP_CACHE: don't invalidate the data cache on open
 160 * FOPEN_NONSEEKABLE: the file is not seekable
 161 */
 162#define FOPEN_DIRECT_IO         (1 << 0)
 163#define FOPEN_KEEP_CACHE        (1 << 1)
 164#define FOPEN_NONSEEKABLE       (1 << 2)
 165
 166/**
 167 * INIT request/reply flags
 168 *
 169 * FUSE_ASYNC_READ: asynchronous read requests
 170 * FUSE_POSIX_LOCKS: remote locking for POSIX file locks
 171 * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported)
 172 * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem
 173 * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
 174 * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB
 175 * FUSE_DONT_MASK: don't apply umask to file mode on create operations
 176 * FUSE_SPLICE_WRITE: kernel supports splice write on the device
 177 * FUSE_SPLICE_MOVE: kernel supports splice move on the device
 178 * FUSE_SPLICE_READ: kernel supports splice read on the device
 179 * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks
 180 * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories
 181 * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages
 182 */
 183#define FUSE_ASYNC_READ         (1 << 0)
 184#define FUSE_POSIX_LOCKS        (1 << 1)
 185#define FUSE_FILE_OPS           (1 << 2)
 186#define FUSE_ATOMIC_O_TRUNC     (1 << 3)
 187#define FUSE_EXPORT_SUPPORT     (1 << 4)
 188#define FUSE_BIG_WRITES         (1 << 5)
 189#define FUSE_DONT_MASK          (1 << 6)
 190#define FUSE_SPLICE_WRITE       (1 << 7)
 191#define FUSE_SPLICE_MOVE        (1 << 8)
 192#define FUSE_SPLICE_READ        (1 << 9)
 193#define FUSE_FLOCK_LOCKS        (1 << 10)
 194#define FUSE_HAS_IOCTL_DIR      (1 << 11)
 195#define FUSE_AUTO_INVAL_DATA    (1 << 12)
 196
 197/**
 198 * CUSE INIT request/reply flags
 199 *
 200 * CUSE_UNRESTRICTED_IOCTL:  use unrestricted ioctl
 201 */
 202#define CUSE_UNRESTRICTED_IOCTL (1 << 0)
 203
 204/**
 205 * Release flags
 206 */
 207#define FUSE_RELEASE_FLUSH      (1 << 0)
 208#define FUSE_RELEASE_FLOCK_UNLOCK       (1 << 1)
 209
 210/**
 211 * Getattr flags
 212 */
 213#define FUSE_GETATTR_FH         (1 << 0)
 214
 215/**
 216 * Lock flags
 217 */
 218#define FUSE_LK_FLOCK           (1 << 0)
 219
 220/**
 221 * WRITE flags
 222 *
 223 * FUSE_WRITE_CACHE: delayed write from page cache, file handle is guessed
 224 * FUSE_WRITE_LOCKOWNER: lock_owner field is valid
 225 */
 226#define FUSE_WRITE_CACHE        (1 << 0)
 227#define FUSE_WRITE_LOCKOWNER    (1 << 1)
 228
 229/**
 230 * Read flags
 231 */
 232#define FUSE_READ_LOCKOWNER     (1 << 1)
 233
 234/**
 235 * Ioctl flags
 236 *
 237 * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
 238 * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed
 239 * FUSE_IOCTL_RETRY: retry with new iovecs
 240 * FUSE_IOCTL_32BIT: 32bit ioctl
 241 * FUSE_IOCTL_DIR: is a directory
 242 *
 243 * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs
 244 */
 245#define FUSE_IOCTL_COMPAT       (1 << 0)
 246#define FUSE_IOCTL_UNRESTRICTED (1 << 1)
 247#define FUSE_IOCTL_RETRY        (1 << 2)
 248#define FUSE_IOCTL_32BIT        (1 << 3)
 249#define FUSE_IOCTL_DIR          (1 << 4)
 250
 251#define FUSE_IOCTL_MAX_IOV      256
 252
 253/**
 254 * Poll flags
 255 *
 256 * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify
 257 */
 258#define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0)
 259
 260enum fuse_opcode {
 261        FUSE_LOOKUP        = 1,
 262        FUSE_FORGET        = 2,  /* no reply */
 263        FUSE_GETATTR       = 3,
 264        FUSE_SETATTR       = 4,
 265        FUSE_READLINK      = 5,
 266        FUSE_SYMLINK       = 6,
 267        FUSE_MKNOD         = 8,
 268        FUSE_MKDIR         = 9,
 269        FUSE_UNLINK        = 10,
 270        FUSE_RMDIR         = 11,
 271        FUSE_RENAME        = 12,
 272        FUSE_LINK          = 13,
 273        FUSE_OPEN          = 14,
 274        FUSE_READ          = 15,
 275        FUSE_WRITE         = 16,
 276        FUSE_STATFS        = 17,
 277        FUSE_RELEASE       = 18,
 278        FUSE_FSYNC         = 20,
 279        FUSE_SETXATTR      = 21,
 280        FUSE_GETXATTR      = 22,
 281        FUSE_LISTXATTR     = 23,
 282        FUSE_REMOVEXATTR   = 24,
 283        FUSE_FLUSH         = 25,
 284        FUSE_INIT          = 26,
 285        FUSE_OPENDIR       = 27,
 286        FUSE_READDIR       = 28,
 287        FUSE_RELEASEDIR    = 29,
 288        FUSE_FSYNCDIR      = 30,
 289        FUSE_GETLK         = 31,
 290        FUSE_SETLK         = 32,
 291        FUSE_SETLKW        = 33,
 292        FUSE_ACCESS        = 34,
 293        FUSE_CREATE        = 35,
 294        FUSE_INTERRUPT     = 36,
 295        FUSE_BMAP          = 37,
 296        FUSE_DESTROY       = 38,
 297        FUSE_IOCTL         = 39,
 298        FUSE_POLL          = 40,
 299        FUSE_NOTIFY_REPLY  = 41,
 300        FUSE_BATCH_FORGET  = 42,
 301        FUSE_FALLOCATE     = 43,
 302
 303        /* CUSE specific operations */
 304        CUSE_INIT          = 4096,
 305};
 306
 307enum fuse_notify_code {
 308        FUSE_NOTIFY_POLL   = 1,
 309        FUSE_NOTIFY_INVAL_INODE = 2,
 310        FUSE_NOTIFY_INVAL_ENTRY = 3,
 311        FUSE_NOTIFY_STORE = 4,
 312        FUSE_NOTIFY_RETRIEVE = 5,
 313        FUSE_NOTIFY_DELETE = 6,
 314        FUSE_NOTIFY_CODE_MAX,
 315};
 316
 317/* The read buffer is required to be at least 8k, but may be much larger */
 318#define FUSE_MIN_READ_BUFFER 8192
 319
 320#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
 321
 322struct fuse_entry_out {
 323        __u64   nodeid;         /* Inode ID */
 324        __u64   generation;     /* Inode generation: nodeid:gen must
 325                                   be unique for the fs's lifetime */
 326        __u64   entry_valid;    /* Cache timeout for the name */
 327        __u64   attr_valid;     /* Cache timeout for the attributes */
 328        __u32   entry_valid_nsec;
 329        __u32   attr_valid_nsec;
 330        struct fuse_attr attr;
 331};
 332
 333struct fuse_forget_in {
 334        __u64   nlookup;
 335};
 336
 337struct fuse_forget_one {
 338        __u64   nodeid;
 339        __u64   nlookup;
 340};
 341
 342struct fuse_batch_forget_in {
 343        __u32   count;
 344        __u32   dummy;
 345};
 346
 347struct fuse_getattr_in {
 348        __u32   getattr_flags;
 349        __u32   dummy;
 350        __u64   fh;
 351};
 352
 353#define FUSE_COMPAT_ATTR_OUT_SIZE 96
 354
 355struct fuse_attr_out {
 356        __u64   attr_valid;     /* Cache timeout for the attributes */
 357        __u32   attr_valid_nsec;
 358        __u32   dummy;
 359        struct fuse_attr attr;
 360};
 361
 362#define FUSE_COMPAT_MKNOD_IN_SIZE 8
 363
 364struct fuse_mknod_in {
 365        __u32   mode;
 366        __u32   rdev;
 367        __u32   umask;
 368        __u32   padding;
 369};
 370
 371struct fuse_mkdir_in {
 372        __u32   mode;
 373        __u32   umask;
 374};
 375
 376struct fuse_rename_in {
 377        __u64   newdir;
 378};
 379
 380struct fuse_link_in {
 381        __u64   oldnodeid;
 382};
 383
 384struct fuse_setattr_in {
 385        __u32   valid;
 386        __u32   padding;
 387        __u64   fh;
 388        __u64   size;
 389        __u64   lock_owner;
 390        __u64   atime;
 391        __u64   mtime;
 392        __u64   unused2;
 393        __u32   atimensec;
 394        __u32   mtimensec;
 395        __u32   unused3;
 396        __u32   mode;
 397        __u32   unused4;
 398        __u32   uid;
 399        __u32   gid;
 400        __u32   unused5;
 401};
 402
 403struct fuse_open_in {
 404        __u32   flags;
 405        __u32   unused;
 406};
 407
 408struct fuse_create_in {
 409        __u32   flags;
 410        __u32   mode;
 411        __u32   umask;
 412        __u32   padding;
 413};
 414
 415struct fuse_open_out {
 416        __u64   fh;
 417        __u32   open_flags;
 418        __u32   padding;
 419};
 420
 421struct fuse_release_in {
 422        __u64   fh;
 423        __u32   flags;
 424        __u32   release_flags;
 425        __u64   lock_owner;
 426};
 427
 428struct fuse_flush_in {
 429        __u64   fh;
 430        __u32   unused;
 431        __u32   padding;
 432        __u64   lock_owner;
 433};
 434
 435struct fuse_read_in {
 436        __u64   fh;
 437        __u64   offset;
 438        __u32   size;
 439        __u32   read_flags;
 440        __u64   lock_owner;
 441        __u32   flags;
 442        __u32   padding;
 443};
 444
 445#define FUSE_COMPAT_WRITE_IN_SIZE 24
 446
 447struct fuse_write_in {
 448        __u64   fh;
 449        __u64   offset;
 450        __u32   size;
 451        __u32   write_flags;
 452        __u64   lock_owner;
 453        __u32   flags;
 454        __u32   padding;
 455};
 456
 457struct fuse_write_out {
 458        __u32   size;
 459        __u32   padding;
 460};
 461
 462#define FUSE_COMPAT_STATFS_SIZE 48
 463
 464struct fuse_statfs_out {
 465        struct fuse_kstatfs st;
 466};
 467
 468struct fuse_fsync_in {
 469        __u64   fh;
 470        __u32   fsync_flags;
 471        __u32   padding;
 472};
 473
 474struct fuse_setxattr_in {
 475        __u32   size;
 476        __u32   flags;
 477};
 478
 479struct fuse_getxattr_in {
 480        __u32   size;
 481        __u32   padding;
 482};
 483
 484struct fuse_getxattr_out {
 485        __u32   size;
 486        __u32   padding;
 487};
 488
 489struct fuse_lk_in {
 490        __u64   fh;
 491        __u64   owner;
 492        struct fuse_file_lock lk;
 493        __u32   lk_flags;
 494        __u32   padding;
 495};
 496
 497struct fuse_lk_out {
 498        struct fuse_file_lock lk;
 499};
 500
 501struct fuse_access_in {
 502        __u32   mask;
 503        __u32   padding;
 504};
 505
 506struct fuse_init_in {
 507        __u32   major;
 508        __u32   minor;
 509        __u32   max_readahead;
 510        __u32   flags;
 511};
 512
 513struct fuse_init_out {
 514        __u32   major;
 515        __u32   minor;
 516        __u32   max_readahead;
 517        __u32   flags;
 518        __u16   max_background;
 519        __u16   congestion_threshold;
 520        __u32   max_write;
 521};
 522
 523#define CUSE_INIT_INFO_MAX 4096
 524
 525struct cuse_init_in {
 526        __u32   major;
 527        __u32   minor;
 528        __u32   unused;
 529        __u32   flags;
 530};
 531
 532struct cuse_init_out {
 533        __u32   major;
 534        __u32   minor;
 535        __u32   unused;
 536        __u32   flags;
 537        __u32   max_read;
 538        __u32   max_write;
 539        __u32   dev_major;              /* chardev major */
 540        __u32   dev_minor;              /* chardev minor */
 541        __u32   spare[10];
 542};
 543
 544struct fuse_interrupt_in {
 545        __u64   unique;
 546};
 547
 548struct fuse_bmap_in {
 549        __u64   block;
 550        __u32   blocksize;
 551        __u32   padding;
 552};
 553
 554struct fuse_bmap_out {
 555        __u64   block;
 556};
 557
 558struct fuse_ioctl_in {
 559        __u64   fh;
 560        __u32   flags;
 561        __u32   cmd;
 562        __u64   arg;
 563        __u32   in_size;
 564        __u32   out_size;
 565};
 566
 567struct fuse_ioctl_iovec {
 568        __u64   base;
 569        __u64   len;
 570};
 571
 572struct fuse_ioctl_out {
 573        __s32   result;
 574        __u32   flags;
 575        __u32   in_iovs;
 576        __u32   out_iovs;
 577};
 578
 579struct fuse_poll_in {
 580        __u64   fh;
 581        __u64   kh;
 582        __u32   flags;
 583        __u32   padding;
 584};
 585
 586struct fuse_poll_out {
 587        __u32   revents;
 588        __u32   padding;
 589};
 590
 591struct fuse_notify_poll_wakeup_out {
 592        __u64   kh;
 593};
 594
 595struct fuse_fallocate_in {
 596        __u64   fh;
 597        __u64   offset;
 598        __u64   length;
 599        __u32   mode;
 600        __u32   padding;
 601};
 602
 603struct fuse_in_header {
 604        __u32   len;
 605        __u32   opcode;
 606        __u64   unique;
 607        __u64   nodeid;
 608        __u32   uid;
 609        __u32   gid;
 610        __u32   pid;
 611        __u32   padding;
 612};
 613
 614struct fuse_out_header {
 615        __u32   len;
 616        __s32   error;
 617        __u64   unique;
 618};
 619
 620struct fuse_dirent {
 621        __u64   ino;
 622        __u64   off;
 623        __u32   namelen;
 624        __u32   type;
 625        char name[];
 626};
 627
 628#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
 629#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
 630#define FUSE_DIRENT_SIZE(d) \
 631        FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
 632
 633struct fuse_notify_inval_inode_out {
 634        __u64   ino;
 635        __s64   off;
 636        __s64   len;
 637};
 638
 639struct fuse_notify_inval_entry_out {
 640        __u64   parent;
 641        __u32   namelen;
 642        __u32   padding;
 643};
 644
 645struct fuse_notify_delete_out {
 646        __u64   parent;
 647        __u64   child;
 648        __u32   namelen;
 649        __u32   padding;
 650};
 651
 652struct fuse_notify_store_out {
 653        __u64   nodeid;
 654        __u64   offset;
 655        __u32   size;
 656        __u32   padding;
 657};
 658
 659struct fuse_notify_retrieve_out {
 660        __u64   notify_unique;
 661        __u64   nodeid;
 662        __u64   offset;
 663        __u32   size;
 664        __u32   padding;
 665};
 666
 667/* Matches the size of fuse_write_in */
 668struct fuse_notify_retrieve_in {
 669        __u64   dummy1;
 670        __u64   offset;
 671        __u32   size;
 672        __u32   dummy2;
 673        __u64   dummy3;
 674        __u64   dummy4;
 675};
 676
 677#endif /* _LINUX_FUSE_H */
 678
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.