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