linux/fs/fuse/fuse_i.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#ifndef _FS_FUSE_I_H
  10#define _FS_FUSE_I_H
  11
  12#include <linux/fuse.h>
  13#include <linux/fs.h>
  14#include <linux/mount.h>
  15#include <linux/wait.h>
  16#include <linux/list.h>
  17#include <linux/spinlock.h>
  18#include <linux/mm.h>
  19#include <linux/backing-dev.h>
  20#include <linux/mutex.h>
  21#include <linux/rwsem.h>
  22#include <linux/rbtree.h>
  23#include <linux/poll.h>
  24
  25/** Max number of pages that can be used in a single read request */
  26#define FUSE_MAX_PAGES_PER_REQ 32
  27
  28/** Bias for fi->writectr, meaning new writepages must not be sent */
  29#define FUSE_NOWRITE INT_MIN
  30
  31/** It could be as large as PATH_MAX, but would that have any uses? */
  32#define FUSE_NAME_MAX 1024
  33
  34/** Number of dentries for each connection in the control filesystem */
  35#define FUSE_CTL_NUM_DENTRIES 5
  36
  37/** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem
  38    module will check permissions based on the file mode.  Otherwise no
  39    permission checking is done in the kernel */
  40#define FUSE_DEFAULT_PERMISSIONS (1 << 0)
  41
  42/** If the FUSE_ALLOW_OTHER flag is given, then not only the user
  43    doing the mount will be allowed to access the filesystem */
  44#define FUSE_ALLOW_OTHER         (1 << 1)
  45
  46/** List of active connections */
  47extern struct list_head fuse_conn_list;
  48
  49/** Global mutex protecting fuse_conn_list and the control filesystem */
  50extern struct mutex fuse_mutex;
  51
  52/** Module parameters */
  53extern unsigned max_user_bgreq;
  54extern unsigned max_user_congthresh;
  55
  56/** FUSE inode */
  57struct fuse_inode {
  58        /** Inode data */
  59        struct inode inode;
  60
  61        /** Unique ID, which identifies the inode between userspace
  62         * and kernel */
  63        u64 nodeid;
  64
  65        /** Number of lookups on this inode */
  66        u64 nlookup;
  67
  68        /** The request used for sending the FORGET message */
  69        struct fuse_req *forget_req;
  70
  71        /** Time in jiffies until the file attributes are valid */
  72        u64 i_time;
  73
  74        /** The sticky bit in inode->i_mode may have been removed, so
  75            preserve the original mode */
  76        mode_t orig_i_mode;
  77
  78        /** Version of last attribute change */
  79        u64 attr_version;
  80
  81        /** Files usable in writepage.  Protected by fc->lock */
  82        struct list_head write_files;
  83
  84        /** Writepages pending on truncate or fsync */
  85        struct list_head queued_writes;
  86
  87        /** Number of sent writes, a negative bias (FUSE_NOWRITE)
  88         * means more writes are blocked */
  89        int writectr;
  90
  91        /** Waitq for writepage completion */
  92        wait_queue_head_t page_waitq;
  93
  94        /** List of writepage requestst (pending or sent) */
  95        struct list_head writepages;
  96};
  97
  98struct fuse_conn;
  99
 100/** FUSE specific file data */
 101struct fuse_file {
 102        /** Fuse connection for this file */
 103        struct fuse_conn *fc;
 104
 105        /** Request reserved for flush and release */
 106        struct fuse_req *reserved_req;
 107
 108        /** Kernel file handle guaranteed to be unique */
 109        u64 kh;
 110
 111        /** File handle used by userspace */
 112        u64 fh;
 113
 114        /** Node id of this file */
 115        u64 nodeid;
 116
 117        /** Refcount */
 118        atomic_t count;
 119
 120        /** FOPEN_* flags returned by open */
 121        u32 open_flags;
 122
 123        /** Entry on inode's write_files list */
 124        struct list_head write_entry;
 125
 126        /** RB node to be linked on fuse_conn->polled_files */
 127        struct rb_node polled_node;
 128
 129        /** Wait queue head for poll */
 130        wait_queue_head_t poll_wait;
 131};
 132
 133/** One input argument of a request */
 134struct fuse_in_arg {
 135        unsigned size;
 136        const void *value;
 137};
 138
 139/** The request input */
 140struct fuse_in {
 141        /** The request header */
 142        struct fuse_in_header h;
 143
 144        /** True if the data for the last argument is in req->pages */
 145        unsigned argpages:1;
 146
 147        /** Number of arguments */
 148        unsigned numargs;
 149
 150        /** Array of arguments */
 151        struct fuse_in_arg args[3];
 152};
 153
 154/** One output argument of a request */
 155struct fuse_arg {
 156        unsigned size;
 157        void *value;
 158};
 159
 160/** The request output */
 161struct fuse_out {
 162        /** Header returned from userspace */
 163        struct fuse_out_header h;
 164
 165        /*
 166         * The following bitfields are not changed during the request
 167         * processing
 168         */
 169
 170        /** Last argument is variable length (can be shorter than
 171            arg->size) */
 172        unsigned argvar:1;
 173
 174        /** Last argument is a list of pages to copy data to */
 175        unsigned argpages:1;
 176
 177        /** Zero partially or not copied pages */
 178        unsigned page_zeroing:1;
 179
 180        /** Number or arguments */
 181        unsigned numargs;
 182
 183        /** Array of arguments */
 184        struct fuse_arg args[3];
 185};
 186
 187/** The request state */
 188enum fuse_req_state {
 189        FUSE_REQ_INIT = 0,
 190        FUSE_REQ_PENDING,
 191        FUSE_REQ_READING,
 192        FUSE_REQ_SENT,
 193        FUSE_REQ_WRITING,
 194        FUSE_REQ_FINISHED
 195};
 196
 197/**
 198 * A request to the client
 199 */
 200struct fuse_req {
 201        /** This can be on either pending processing or io lists in
 202            fuse_conn */
 203        struct list_head list;
 204
 205        /** Entry on the interrupts list  */
 206        struct list_head intr_entry;
 207
 208        /** refcount */
 209        atomic_t count;
 210
 211        /** Unique ID for the interrupt request */
 212        u64 intr_unique;
 213
 214        /*
 215         * The following bitfields are either set once before the
 216         * request is queued or setting/clearing them is protected by
 217         * fuse_conn->lock
 218         */
 219
 220        /** True if the request has reply */
 221        unsigned isreply:1;
 222
 223        /** Force sending of the request even if interrupted */
 224        unsigned force:1;
 225
 226        /** The request was aborted */
 227        unsigned aborted:1;
 228
 229        /** Request is sent in the background */
 230        unsigned background:1;
 231
 232        /** The request has been interrupted */
 233        unsigned interrupted:1;
 234
 235        /** Data is being copied to/from the request */
 236        unsigned locked:1;
 237
 238        /** Request is counted as "waiting" */
 239        unsigned waiting:1;
 240
 241        /** State of the request */
 242        enum fuse_req_state state;
 243
 244        /** The request input */
 245        struct fuse_in in;
 246
 247        /** The request output */
 248        struct fuse_out out;
 249
 250        /** Used to wake up the task waiting for completion of request*/
 251        wait_queue_head_t waitq;
 252
 253        /** Data for asynchronous requests */
 254        union {
 255                struct fuse_forget_in forget_in;
 256                struct {
 257                        struct fuse_release_in in;
 258                        struct path path;
 259                } release;
 260                struct fuse_init_in init_in;
 261                struct fuse_init_out init_out;
 262                struct cuse_init_in cuse_init_in;
 263                struct cuse_init_out cuse_init_out;
 264                struct {
 265                        struct fuse_read_in in;
 266                        u64 attr_ver;
 267                } read;
 268                struct {
 269                        struct fuse_write_in in;
 270                        struct fuse_write_out out;
 271                } write;
 272                struct fuse_lk_in lk_in;
 273        } misc;
 274
 275        /** page vector */
 276        struct page *pages[FUSE_MAX_PAGES_PER_REQ];
 277
 278        /** number of pages in vector */
 279        unsigned num_pages;
 280
 281        /** offset of data on first page */
 282        unsigned page_offset;
 283
 284        /** File used in the request (or NULL) */
 285        struct fuse_file *ff;
 286
 287        /** Inode used in the request or NULL */
 288        struct inode *inode;
 289
 290        /** Link on fi->writepages */
 291        struct list_head writepages_entry;
 292
 293        /** Request completion callback */
 294        void (*end)(struct fuse_conn *, struct fuse_req *);
 295
 296        /** Request is stolen from fuse_file->reserved_req */
 297        struct file *stolen_file;
 298};
 299
 300/**
 301 * A Fuse connection.
 302 *
 303 * This structure is created, when the filesystem is mounted, and is
 304 * destroyed, when the client device is closed and the filesystem is
 305 * unmounted.
 306 */
 307struct fuse_conn {
 308        /** Lock protecting accessess to  members of this structure */
 309        spinlock_t lock;
 310
 311        /** Mutex protecting against directory alias creation */
 312        struct mutex inst_mutex;
 313
 314        /** Refcount */
 315        atomic_t count;
 316
 317        /** The user id for this mount */
 318        uid_t user_id;
 319
 320        /** The group id for this mount */
 321        gid_t group_id;
 322
 323        /** The fuse mount flags for this mount */
 324        unsigned flags;
 325
 326        /** Maximum read size */
 327        unsigned max_read;
 328
 329        /** Maximum write size */
 330        unsigned max_write;
 331
 332        /** Readers of the connection are waiting on this */
 333        wait_queue_head_t waitq;
 334
 335        /** The list of pending requests */
 336        struct list_head pending;
 337
 338        /** The list of requests being processed */
 339        struct list_head processing;
 340
 341        /** The list of requests under I/O */
 342        struct list_head io;
 343
 344        /** The next unique kernel file handle */
 345        u64 khctr;
 346
 347        /** rbtree of fuse_files waiting for poll events indexed by ph */
 348        struct rb_root polled_files;
 349
 350        /** Maximum number of outstanding background requests */
 351        unsigned max_background;
 352
 353        /** Number of background requests at which congestion starts */
 354        unsigned congestion_threshold;
 355
 356        /** Number of requests currently in the background */
 357        unsigned num_background;
 358
 359        /** Number of background requests currently queued for userspace */
 360        unsigned active_background;
 361
 362        /** The list of background requests set aside for later queuing */
 363        struct list_head bg_queue;
 364
 365        /** Pending interrupts */
 366        struct list_head interrupts;
 367
 368        /** Flag indicating if connection is blocked.  This will be
 369            the case before the INIT reply is received, and if there
 370            are too many outstading backgrounds requests */
 371        int blocked;
 372
 373        /** waitq for blocked connection */
 374        wait_queue_head_t blocked_waitq;
 375
 376        /** waitq for reserved requests */
 377        wait_queue_head_t reserved_req_waitq;
 378
 379        /** The next unique request id */
 380        u64 reqctr;
 381
 382        /** Connection established, cleared on umount, connection
 383            abort and device release */
 384        unsigned connected;
 385
 386        /** Connection failed (version mismatch).  Cannot race with
 387            setting other bitfields since it is only set once in INIT
 388            reply, before any other request, and never cleared */
 389        unsigned conn_error:1;
 390
 391        /** Connection successful.  Only set in INIT */
 392        unsigned conn_init:1;
 393
 394        /** Do readpages asynchronously?  Only set in INIT */
 395        unsigned async_read:1;
 396
 397        /** Do not send separate SETATTR request before open(O_TRUNC)  */
 398        unsigned atomic_o_trunc:1;
 399
 400        /** Filesystem supports NFS exporting.  Only set in INIT */
 401        unsigned export_support:1;
 402
 403        /** Set if bdi is valid */
 404        unsigned bdi_initialized:1;
 405
 406        /*
 407         * The following bitfields are only for optimization purposes
 408         * and hence races in setting them will not cause malfunction
 409         */
 410
 411        /** Is fsync not implemented by fs? */
 412        unsigned no_fsync:1;
 413
 414        /** Is fsyncdir not implemented by fs? */
 415        unsigned no_fsyncdir:1;
 416
 417        /** Is flush not implemented by fs? */
 418        unsigned no_flush:1;
 419
 420        /** Is setxattr not implemented by fs? */
 421        unsigned no_setxattr:1;
 422
 423        /** Is getxattr not implemented by fs? */
 424        unsigned no_getxattr:1;
 425
 426        /** Is listxattr not implemented by fs? */
 427        unsigned no_listxattr:1;
 428
 429        /** Is removexattr not implemented by fs? */
 430        unsigned no_removexattr:1;
 431
 432        /** Are file locking primitives not implemented by fs? */
 433        unsigned no_lock:1;
 434
 435        /** Is access not implemented by fs? */
 436        unsigned no_access:1;
 437
 438        /** Is create not implemented by fs? */
 439        unsigned no_create:1;
 440
 441        /** Is interrupt not implemented by fs? */
 442        unsigned no_interrupt:1;
 443
 444        /** Is bmap not implemented by fs? */
 445        unsigned no_bmap:1;
 446
 447        /** Is poll not implemented by fs? */
 448        unsigned no_poll:1;
 449
 450        /** Do multi-page cached writes */
 451        unsigned big_writes:1;
 452
 453        /** Don't apply umask to creation modes */
 454        unsigned dont_mask:1;
 455
 456        /** The number of requests waiting for completion */
 457        atomic_t num_waiting;
 458
 459        /** Negotiated minor version */
 460        unsigned minor;
 461
 462        /** Backing dev info */
 463        struct backing_dev_info bdi;
 464
 465        /** Entry on the fuse_conn_list */
 466        struct list_head entry;
 467
 468        /** Device ID from super block */
 469        dev_t dev;
 470
 471        /** Dentries in the control filesystem */
 472        struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES];
 473
 474        /** number of dentries used in the above array */
 475        int ctl_ndents;
 476
 477        /** O_ASYNC requests */
 478        struct fasync_struct *fasync;
 479
 480        /** Key for lock owner ID scrambling */
 481        u32 scramble_key[4];
 482
 483        /** Reserved request for the DESTROY message */
 484        struct fuse_req *destroy_req;
 485
 486        /** Version counter for attribute changes */
 487        u64 attr_version;
 488
 489        /** Called on final put */
 490        void (*release)(struct fuse_conn *);
 491
 492        /** Super block for this connection. */
 493        struct super_block *sb;
 494
 495        /** Read/write semaphore to hold when accessing sb. */
 496        struct rw_semaphore killsb;
 497};
 498
 499static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
 500{
 501        return sb->s_fs_info;
 502}
 503
 504static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
 505{
 506        return get_fuse_conn_super(inode->i_sb);
 507}
 508
 509static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
 510{
 511        return container_of(inode, struct fuse_inode, inode);
 512}
 513
 514static inline u64 get_node_id(struct inode *inode)
 515{
 516        return get_fuse_inode(inode)->nodeid;
 517}
 518
 519/** Device operations */
 520extern const struct file_operations fuse_dev_operations;
 521
 522extern const struct dentry_operations fuse_dentry_operations;
 523
 524/**
 525 * Inode to nodeid comparison.
 526 */
 527int fuse_inode_eq(struct inode *inode, void *_nodeidp);
 528
 529/**
 530 * Get a filled in inode
 531 */
 532struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
 533                        int generation, struct fuse_attr *attr,
 534                        u64 attr_valid, u64 attr_version);
 535
 536int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
 537                     struct fuse_entry_out *outarg, struct inode **inode);
 538
 539/**
 540 * Send FORGET command
 541 */
 542void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
 543                      u64 nodeid, u64 nlookup);
 544
 545/**
 546 * Initialize READ or READDIR request
 547 */
 548void fuse_read_fill(struct fuse_req *req, struct file *file,
 549                    loff_t pos, size_t count, int opcode);
 550
 551/**
 552 * Send OPEN or OPENDIR request
 553 */
 554int fuse_open_common(struct inode *inode, struct file *file, bool isdir);
 555
 556struct fuse_file *fuse_file_alloc(struct fuse_conn *fc);
 557struct fuse_file *fuse_file_get(struct fuse_file *ff);
 558void fuse_file_free(struct fuse_file *ff);
 559void fuse_finish_open(struct inode *inode, struct file *file);
 560
 561void fuse_sync_release(struct fuse_file *ff, int flags);
 562
 563/**
 564 * Send RELEASE or RELEASEDIR request
 565 */
 566void fuse_release_common(struct file *file, int opcode);
 567
 568/**
 569 * Send FSYNC or FSYNCDIR request
 570 */
 571int fuse_fsync_common(struct file *file, struct dentry *de, int datasync,
 572                      int isdir);
 573
 574/**
 575 * Notify poll wakeup
 576 */
 577int fuse_notify_poll_wakeup(struct fuse_conn *fc,
 578                            struct fuse_notify_poll_wakeup_out *outarg);
 579
 580/**
 581 * Initialize file operations on a regular file
 582 */
 583void fuse_init_file_inode(struct inode *inode);
 584
 585/**
 586 * Initialize inode operations on regular files and special files
 587 */
 588void fuse_init_common(struct inode *inode);
 589
 590/**
 591 * Initialize inode and file operations on a directory
 592 */
 593void fuse_init_dir(struct inode *inode);
 594
 595/**
 596 * Initialize inode operations on a symlink
 597 */
 598void fuse_init_symlink(struct inode *inode);
 599
 600/**
 601 * Change attributes of an inode
 602 */
 603void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
 604                            u64 attr_valid, u64 attr_version);
 605
 606void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
 607                                   u64 attr_valid);
 608
 609/**
 610 * Initialize the client device
 611 */
 612int fuse_dev_init(void);
 613
 614/**
 615 * Cleanup the client device
 616 */
 617void fuse_dev_cleanup(void);
 618
 619int fuse_ctl_init(void);
 620void fuse_ctl_cleanup(void);
 621
 622/**
 623 * Allocate a request
 624 */
 625struct fuse_req *fuse_request_alloc(void);
 626
 627struct fuse_req *fuse_request_alloc_nofs(void);
 628
 629/**
 630 * Free a request
 631 */
 632void fuse_request_free(struct fuse_req *req);
 633
 634/**
 635 * Get a request, may fail with -ENOMEM
 636 */
 637struct fuse_req *fuse_get_req(struct fuse_conn *fc);
 638
 639/**
 640 * Gets a requests for a file operation, always succeeds
 641 */
 642struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file);
 643
 644/**
 645 * Decrement reference count of a request.  If count goes to zero free
 646 * the request.
 647 */
 648void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
 649
 650/**
 651 * Send a request (synchronous)
 652 */
 653void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req);
 654
 655/**
 656 * Send a request with no reply
 657 */
 658void fuse_request_send_noreply(struct fuse_conn *fc, struct fuse_req *req);
 659
 660/**
 661 * Send a request in the background
 662 */
 663void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req);
 664
 665void fuse_request_send_background_locked(struct fuse_conn *fc,
 666                                         struct fuse_req *req);
 667
 668/* Abort all requests */
 669void fuse_abort_conn(struct fuse_conn *fc);
 670
 671/**
 672 * Invalidate inode attributes
 673 */
 674void fuse_invalidate_attr(struct inode *inode);
 675
 676void fuse_invalidate_entry_cache(struct dentry *entry);
 677
 678/**
 679 * Acquire reference to fuse_conn
 680 */
 681struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
 682
 683void fuse_conn_kill(struct fuse_conn *fc);
 684
 685/**
 686 * Initialize fuse_conn
 687 */
 688void fuse_conn_init(struct fuse_conn *fc);
 689
 690/**
 691 * Release reference to fuse_conn
 692 */
 693void fuse_conn_put(struct fuse_conn *fc);
 694
 695/**
 696 * Add connection to control filesystem
 697 */
 698int fuse_ctl_add_conn(struct fuse_conn *fc);
 699
 700/**
 701 * Remove connection from control filesystem
 702 */
 703void fuse_ctl_remove_conn(struct fuse_conn *fc);
 704
 705/**
 706 * Is file type valid?
 707 */
 708int fuse_valid_type(int m);
 709
 710/**
 711 * Is task allowed to perform filesystem operation?
 712 */
 713int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task);
 714
 715u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
 716
 717int fuse_update_attributes(struct inode *inode, struct kstat *stat,
 718                           struct file *file, bool *refreshed);
 719
 720void fuse_flush_writepages(struct inode *inode);
 721
 722void fuse_set_nowrite(struct inode *inode);
 723void fuse_release_nowrite(struct inode *inode);
 724
 725u64 fuse_get_attr_version(struct fuse_conn *fc);
 726
 727/**
 728 * File-system tells the kernel to invalidate cache for the given node id.
 729 */
 730int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
 731                             loff_t offset, loff_t len);
 732
 733/**
 734 * File-system tells the kernel to invalidate parent attributes and
 735 * the dentry matching parent/name.
 736 */
 737int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
 738                             struct qstr *name);
 739
 740int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
 741                 bool isdir);
 742ssize_t fuse_direct_io(struct file *file, const char __user *buf,
 743                       size_t count, loff_t *ppos, int write);
 744long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
 745                   unsigned int flags);
 746unsigned fuse_file_poll(struct file *file, poll_table *wait);
 747int fuse_dev_release(struct inode *inode, struct file *file);
 748
 749#endif /* _FS_FUSE_I_H */
 750