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#include <linux/workqueue.h>
  25#include <linux/kref.h>
  26#include <linux/xattr.h>
  27
  28/** Max number of pages that can be used in a single read request */
  29#define FUSE_MAX_PAGES_PER_REQ 32
  30
  31/** Bias for fi->writectr, meaning new writepages must not be sent */
  32#define FUSE_NOWRITE INT_MIN
  33
  34/** It could be as large as PATH_MAX, but would that have any uses? */
  35#define FUSE_NAME_MAX 1024
  36
  37/** Number of dentries for each connection in the control filesystem */
  38#define FUSE_CTL_NUM_DENTRIES 5
  39
  40/** Number of page pointers embedded in fuse_req */
  41#define FUSE_REQ_INLINE_PAGES 1
  42
  43/** List of active connections */
  44extern struct list_head fuse_conn_list;
  45
  46/** Global mutex protecting fuse_conn_list and the control filesystem */
  47extern struct mutex fuse_mutex;
  48
  49/** Module parameters */
  50extern unsigned max_user_bgreq;
  51extern unsigned max_user_congthresh;
  52
  53/* One forget request */
  54struct fuse_forget_link {
  55        struct fuse_forget_one forget_one;
  56        struct fuse_forget_link *next;
  57};
  58
  59/** FUSE inode */
  60struct fuse_inode {
  61        /** Inode data */
  62        struct inode inode;
  63
  64        /** Unique ID, which identifies the inode between userspace
  65         * and kernel */
  66        u64 nodeid;
  67
  68        /** Number of lookups on this inode */
  69        u64 nlookup;
  70
  71        /** The request used for sending the FORGET message */
  72        struct fuse_forget_link *forget;
  73
  74        /** Time in jiffies until the file attributes are valid */
  75        u64 i_time;
  76
  77        /** The sticky bit in inode->i_mode may have been removed, so
  78            preserve the original mode */
  79        umode_t orig_i_mode;
  80
  81        /** 64 bit inode number */
  82        u64 orig_ino;
  83
  84        /** Version of last attribute change */
  85        u64 attr_version;
  86
  87        /** Files usable in writepage.  Protected by fc->lock */
  88        struct list_head write_files;
  89
  90        /** Writepages pending on truncate or fsync */
  91        struct list_head queued_writes;
  92
  93        /** Number of sent writes, a negative bias (FUSE_NOWRITE)
  94         * means more writes are blocked */
  95        int writectr;
  96
  97        /** Waitq for writepage completion */
  98        wait_queue_head_t page_waitq;
  99
 100        /** List of writepage requestst (pending or sent) */
 101        struct list_head writepages;
 102
 103        /** Miscellaneous bits describing inode state */
 104        unsigned long state;
 105
 106        /** Lock for serializing lookup and readdir for back compatibility*/
 107        struct mutex mutex;
 108};
 109
 110/** FUSE inode state bits */
 111enum {
 112        /** Advise readdirplus  */
 113        FUSE_I_ADVISE_RDPLUS,
 114        /** Initialized with readdirplus */
 115        FUSE_I_INIT_RDPLUS,
 116        /** An operation changing file size is in progress  */
 117        FUSE_I_SIZE_UNSTABLE,
 118};
 119
 120struct fuse_conn;
 121
 122/** FUSE specific file data */
 123struct fuse_file {
 124        /** Fuse connection for this file */
 125        struct fuse_conn *fc;
 126
 127        /** Request reserved for flush and release */
 128        struct fuse_req *reserved_req;
 129
 130        /** Kernel file handle guaranteed to be unique */
 131        u64 kh;
 132
 133        /** File handle used by userspace */
 134        u64 fh;
 135
 136        /** Node id of this file */
 137        u64 nodeid;
 138
 139        /** Refcount */
 140        atomic_t count;
 141
 142        /** FOPEN_* flags returned by open */
 143        u32 open_flags;
 144
 145        /** Entry on inode's write_files list */
 146        struct list_head write_entry;
 147
 148        /** RB node to be linked on fuse_conn->polled_files */
 149        struct rb_node polled_node;
 150
 151        /** Wait queue head for poll */
 152        wait_queue_head_t poll_wait;
 153
 154        /** Has flock been performed on this file? */
 155        bool flock:1;
 156};
 157
 158/** One input argument of a request */
 159struct fuse_in_arg {
 160        unsigned size;
 161        const void *value;
 162};
 163
 164/** The request input */
 165struct fuse_in {
 166        /** The request header */
 167        struct fuse_in_header h;
 168
 169        /** True if the data for the last argument is in req->pages */
 170        unsigned argpages:1;
 171
 172        /** Number of arguments */
 173        unsigned numargs;
 174
 175        /** Array of arguments */
 176        struct fuse_in_arg args[3];
 177};
 178
 179/** One output argument of a request */
 180struct fuse_arg {
 181        unsigned size;
 182        void *value;
 183};
 184
 185/** The request output */
 186struct fuse_out {
 187        /** Header returned from userspace */
 188        struct fuse_out_header h;
 189
 190        /*
 191         * The following bitfields are not changed during the request
 192         * processing
 193         */
 194
 195        /** Last argument is variable length (can be shorter than
 196            arg->size) */
 197        unsigned argvar:1;
 198
 199        /** Last argument is a list of pages to copy data to */
 200        unsigned argpages:1;
 201
 202        /** Zero partially or not copied pages */
 203        unsigned page_zeroing:1;
 204
 205        /** Pages may be replaced with new ones */
 206        unsigned page_replace:1;
 207
 208        /** Number or arguments */
 209        unsigned numargs;
 210
 211        /** Array of arguments */
 212        struct fuse_arg args[2];
 213};
 214
 215/** FUSE page descriptor */
 216struct fuse_page_desc {
 217        unsigned int length;
 218        unsigned int offset;
 219};
 220
 221struct fuse_args {
 222        struct {
 223                struct {
 224                        uint32_t opcode;
 225                        uint64_t nodeid;
 226                } h;
 227                unsigned numargs;
 228                struct fuse_in_arg args[3];
 229
 230        } in;
 231        struct {
 232                unsigned argvar:1;
 233                unsigned numargs;
 234                struct fuse_arg args[2];
 235        } out;
 236};
 237
 238#define FUSE_ARGS(args) struct fuse_args args = {}
 239
 240/** The request IO state (for asynchronous processing) */
 241struct fuse_io_priv {
 242        struct kref refcnt;
 243        int async;
 244        spinlock_t lock;
 245        unsigned reqs;
 246        ssize_t bytes;
 247        size_t size;
 248        __u64 offset;
 249        bool write;
 250        int err;
 251        struct kiocb *iocb;
 252        struct file *file;
 253        struct completion *done;
 254        bool blocking;
 255};
 256
 257#define FUSE_IO_PRIV_SYNC(f) \
 258{                                       \
 259        .refcnt = { ATOMIC_INIT(1) },   \
 260        .async = 0,                     \
 261        .file = f,                      \
 262}
 263
 264/**
 265 * Request flags
 266 *
 267 * FR_ISREPLY:          set if the request has reply
 268 * FR_FORCE:            force sending of the request even if interrupted
 269 * FR_BACKGROUND:       request is sent in the background
 270 * FR_WAITING:          request is counted as "waiting"
 271 * FR_ABORTED:          the request was aborted
 272 * FR_INTERRUPTED:      the request has been interrupted
 273 * FR_LOCKED:           data is being copied to/from the request
 274 * FR_PENDING:          request is not yet in userspace
 275 * FR_SENT:             request is in userspace, waiting for an answer
 276 * FR_FINISHED:         request is finished
 277 * FR_PRIVATE:          request is on private list
 278 */
 279enum fuse_req_flag {
 280        FR_ISREPLY,
 281        FR_FORCE,
 282        FR_BACKGROUND,
 283        FR_WAITING,
 284        FR_ABORTED,
 285        FR_INTERRUPTED,
 286        FR_LOCKED,
 287        FR_PENDING,
 288        FR_SENT,
 289        FR_FINISHED,
 290        FR_PRIVATE,
 291};
 292
 293/**
 294 * A request to the client
 295 *
 296 * .waitq.lock protects the following fields:
 297 *   - FR_ABORTED
 298 *   - FR_LOCKED (may also be modified under fc->lock, tested under both)
 299 */
 300struct fuse_req {
 301        /** This can be on either pending processing or io lists in
 302            fuse_conn */
 303        struct list_head list;
 304
 305        /** Entry on the interrupts list  */
 306        struct list_head intr_entry;
 307
 308        /** refcount */
 309        atomic_t count;
 310
 311        /** Unique ID for the interrupt request */
 312        u64 intr_unique;
 313
 314        /* Request flags, updated with test/set/clear_bit() */
 315        unsigned long flags;
 316
 317        /** The request input */
 318        struct fuse_in in;
 319
 320        /** The request output */
 321        struct fuse_out out;
 322
 323        /** Used to wake up the task waiting for completion of request*/
 324        wait_queue_head_t waitq;
 325
 326        /** Data for asynchronous requests */
 327        union {
 328                struct {
 329                        struct fuse_release_in in;
 330                        struct inode *inode;
 331                } release;
 332                struct fuse_init_in init_in;
 333                struct fuse_init_out init_out;
 334                struct cuse_init_in cuse_init_in;
 335                struct {
 336                        struct fuse_read_in in;
 337                        u64 attr_ver;
 338                } read;
 339                struct {
 340                        struct fuse_write_in in;
 341                        struct fuse_write_out out;
 342                        struct fuse_req *next;
 343                } write;
 344                struct fuse_notify_retrieve_in retrieve_in;
 345        } misc;
 346
 347        /** page vector */
 348        struct page **pages;
 349
 350        /** page-descriptor vector */
 351        struct fuse_page_desc *page_descs;
 352
 353        /** size of the 'pages' array */
 354        unsigned max_pages;
 355
 356        /** inline page vector */
 357        struct page *inline_pages[FUSE_REQ_INLINE_PAGES];
 358
 359        /** inline page-descriptor vector */
 360        struct fuse_page_desc inline_page_descs[FUSE_REQ_INLINE_PAGES];
 361
 362        /** number of pages in vector */
 363        unsigned num_pages;
 364
 365        /** File used in the request (or NULL) */
 366        struct fuse_file *ff;
 367
 368        /** Inode used in the request or NULL */
 369        struct inode *inode;
 370
 371        /** AIO control block */
 372        struct fuse_io_priv *io;
 373
 374        /** Link on fi->writepages */
 375        struct list_head writepages_entry;
 376
 377        /** Request completion callback */
 378        void (*end)(struct fuse_conn *, struct fuse_req *);
 379
 380        /** Request is stolen from fuse_file->reserved_req */
 381        struct file *stolen_file;
 382};
 383
 384struct fuse_iqueue {
 385        /** Connection established */
 386        unsigned connected;
 387
 388        /** Readers of the connection are waiting on this */
 389        wait_queue_head_t waitq;
 390
 391        /** The next unique request id */
 392        u64 reqctr;
 393
 394        /** The list of pending requests */
 395        struct list_head pending;
 396
 397        /** Pending interrupts */
 398        struct list_head interrupts;
 399
 400        /** Queue of pending forgets */
 401        struct fuse_forget_link forget_list_head;
 402        struct fuse_forget_link *forget_list_tail;
 403
 404        /** Batching of FORGET requests (positive indicates FORGET batch) */
 405        int forget_batch;
 406
 407        /** O_ASYNC requests */
 408        struct fasync_struct *fasync;
 409};
 410
 411struct fuse_pqueue {
 412        /** Connection established */
 413        unsigned connected;
 414
 415        /** Lock protecting accessess to  members of this structure */
 416        spinlock_t lock;
 417
 418        /** The list of requests being processed */
 419        struct list_head processing;
 420
 421        /** The list of requests under I/O */
 422        struct list_head io;
 423};
 424
 425/**
 426 * Fuse device instance
 427 */
 428struct fuse_dev {
 429        /** Fuse connection for this device */
 430        struct fuse_conn *fc;
 431
 432        /** Processing queue */
 433        struct fuse_pqueue pq;
 434
 435        /** list entry on fc->devices */
 436        struct list_head entry;
 437};
 438
 439/**
 440 * A Fuse connection.
 441 *
 442 * This structure is created, when the filesystem is mounted, and is
 443 * destroyed, when the client device is closed and the filesystem is
 444 * unmounted.
 445 */
 446struct fuse_conn {
 447        /** Lock protecting accessess to  members of this structure */
 448        spinlock_t lock;
 449
 450        /** Refcount */
 451        atomic_t count;
 452
 453        /** Number of fuse_dev's */
 454        atomic_t dev_count;
 455
 456        struct rcu_head rcu;
 457
 458        /** The user id for this mount */
 459        kuid_t user_id;
 460
 461        /** The group id for this mount */
 462        kgid_t group_id;
 463
 464        /** Maximum read size */
 465        unsigned max_read;
 466
 467        /** Maximum write size */
 468        unsigned max_write;
 469
 470        /** Input queue */
 471        struct fuse_iqueue iq;
 472
 473        /** The next unique kernel file handle */
 474        u64 khctr;
 475
 476        /** rbtree of fuse_files waiting for poll events indexed by ph */
 477        struct rb_root polled_files;
 478
 479        /** Maximum number of outstanding background requests */
 480        unsigned max_background;
 481
 482        /** Number of background requests at which congestion starts */
 483        unsigned congestion_threshold;
 484
 485        /** Number of requests currently in the background */
 486        unsigned num_background;
 487
 488        /** Number of background requests currently queued for userspace */
 489        unsigned active_background;
 490
 491        /** The list of background requests set aside for later queuing */
 492        struct list_head bg_queue;
 493
 494        /** Flag indicating that INIT reply has been received. Allocating
 495         * any fuse request will be suspended until the flag is set */
 496        int initialized;
 497
 498        /** Flag indicating if connection is blocked.  This will be
 499            the case before the INIT reply is received, and if there
 500            are too many outstading backgrounds requests */
 501        int blocked;
 502
 503        /** waitq for blocked connection */
 504        wait_queue_head_t blocked_waitq;
 505
 506        /** waitq for reserved requests */
 507        wait_queue_head_t reserved_req_waitq;
 508
 509        /** Connection established, cleared on umount, connection
 510            abort and device release */
 511        unsigned connected;
 512
 513        /** Connection failed (version mismatch).  Cannot race with
 514            setting other bitfields since it is only set once in INIT
 515            reply, before any other request, and never cleared */
 516        unsigned conn_error:1;
 517
 518        /** Connection successful.  Only set in INIT */
 519        unsigned conn_init:1;
 520
 521        /** Do readpages asynchronously?  Only set in INIT */
 522        unsigned async_read:1;
 523
 524        /** Do not send separate SETATTR request before open(O_TRUNC)  */
 525        unsigned atomic_o_trunc:1;
 526
 527        /** Filesystem supports NFS exporting.  Only set in INIT */
 528        unsigned export_support:1;
 529
 530        /** Set if bdi is valid */
 531        unsigned bdi_initialized:1;
 532
 533        /** write-back cache policy (default is write-through) */
 534        unsigned writeback_cache:1;
 535
 536        /** allow parallel lookups and readdir (default is serialized) */
 537        unsigned parallel_dirops:1;
 538
 539        /** handle fs handles killing suid/sgid/cap on write/chown/trunc */
 540        unsigned handle_killpriv:1;
 541
 542        /*
 543         * The following bitfields are only for optimization purposes
 544         * and hence races in setting them will not cause malfunction
 545         */
 546
 547        /** Is open/release not implemented by fs? */
 548        unsigned no_open:1;
 549
 550        /** Is fsync not implemented by fs? */
 551        unsigned no_fsync:1;
 552
 553        /** Is fsyncdir not implemented by fs? */
 554        unsigned no_fsyncdir:1;
 555
 556        /** Is flush not implemented by fs? */
 557        unsigned no_flush:1;
 558
 559        /** Is setxattr not implemented by fs? */
 560        unsigned no_setxattr:1;
 561
 562        /** Is getxattr not implemented by fs? */
 563        unsigned no_getxattr:1;
 564
 565        /** Is listxattr not implemented by fs? */
 566        unsigned no_listxattr:1;
 567
 568        /** Is removexattr not implemented by fs? */
 569        unsigned no_removexattr:1;
 570
 571        /** Are posix file locking primitives not implemented by fs? */
 572        unsigned no_lock:1;
 573
 574        /** Is access not implemented by fs? */
 575        unsigned no_access:1;
 576
 577        /** Is create not implemented by fs? */
 578        unsigned no_create:1;
 579
 580        /** Is interrupt not implemented by fs? */
 581        unsigned no_interrupt:1;
 582
 583        /** Is bmap not implemented by fs? */
 584        unsigned no_bmap:1;
 585
 586        /** Is poll not implemented by fs? */
 587        unsigned no_poll:1;
 588
 589        /** Do multi-page cached writes */
 590        unsigned big_writes:1;
 591
 592        /** Don't apply umask to creation modes */
 593        unsigned dont_mask:1;
 594
 595        /** Are BSD file locking primitives not implemented by fs? */
 596        unsigned no_flock:1;
 597
 598        /** Is fallocate not implemented by fs? */
 599        unsigned no_fallocate:1;
 600
 601        /** Is rename with flags implemented by fs? */
 602        unsigned no_rename2:1;
 603
 604        /** Use enhanced/automatic page cache invalidation. */
 605        unsigned auto_inval_data:1;
 606
 607        /** Does the filesystem support readdirplus? */
 608        unsigned do_readdirplus:1;
 609
 610        /** Does the filesystem want adaptive readdirplus? */
 611        unsigned readdirplus_auto:1;
 612
 613        /** Does the filesystem support asynchronous direct-IO submission? */
 614        unsigned async_dio:1;
 615
 616        /** Is lseek not implemented by fs? */
 617        unsigned no_lseek:1;
 618
 619        /** Does the filesystem support posix acls? */
 620        unsigned posix_acl:1;
 621
 622        /** Check permissions based on the file mode or not? */
 623        unsigned default_permissions:1;
 624
 625        /** Allow other than the mounter user to access the filesystem ? */
 626        unsigned allow_other:1;
 627
 628        /** The number of requests waiting for completion */
 629        atomic_t num_waiting;
 630
 631        /** Negotiated minor version */
 632        unsigned minor;
 633
 634        /** Backing dev info */
 635        struct backing_dev_info bdi;
 636
 637        /** Entry on the fuse_conn_list */
 638        struct list_head entry;
 639
 640        /** Device ID from super block */
 641        dev_t dev;
 642
 643        /** Dentries in the control filesystem */
 644        struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES];
 645
 646        /** number of dentries used in the above array */
 647        int ctl_ndents;
 648
 649        /** Key for lock owner ID scrambling */
 650        u32 scramble_key[4];
 651
 652        /** Reserved request for the DESTROY message */
 653        struct fuse_req *destroy_req;
 654
 655        /** Version counter for attribute changes */
 656        u64 attr_version;
 657
 658        /** Called on final put */
 659        void (*release)(struct fuse_conn *);
 660
 661        /** Super block for this connection. */
 662        struct super_block *sb;
 663
 664        /** Read/write semaphore to hold when accessing sb. */
 665        struct rw_semaphore killsb;
 666
 667        /** List of device instances belonging to this connection */
 668        struct list_head devices;
 669};
 670
 671static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
 672{
 673        return sb->s_fs_info;
 674}
 675
 676static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
 677{
 678        return get_fuse_conn_super(inode->i_sb);
 679}
 680
 681static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
 682{
 683        return container_of(inode, struct fuse_inode, inode);
 684}
 685
 686static inline u64 get_node_id(struct inode *inode)
 687{
 688        return get_fuse_inode(inode)->nodeid;
 689}
 690
 691/** Device operations */
 692extern const struct file_operations fuse_dev_operations;
 693
 694extern const struct dentry_operations fuse_dentry_operations;
 695extern const struct dentry_operations fuse_root_dentry_operations;
 696
 697/**
 698 * Inode to nodeid comparison.
 699 */
 700int fuse_inode_eq(struct inode *inode, void *_nodeidp);
 701
 702/**
 703 * Get a filled in inode
 704 */
 705struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
 706                        int generation, struct fuse_attr *attr,
 707                        u64 attr_valid, u64 attr_version);
 708
 709int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
 710                     struct fuse_entry_out *outarg, struct inode **inode);
 711
 712/**
 713 * Send FORGET command
 714 */
 715void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,
 716                       u64 nodeid, u64 nlookup);
 717
 718struct fuse_forget_link *fuse_alloc_forget(void);
 719
 720/* Used by READDIRPLUS */
 721void fuse_force_forget(struct file *file, u64 nodeid);
 722
 723/**
 724 * Initialize READ or READDIR request
 725 */
 726void fuse_read_fill(struct fuse_req *req, struct file *file,
 727                    loff_t pos, size_t count, int opcode);
 728
 729/**
 730 * Send OPEN or OPENDIR request
 731 */
 732int fuse_open_common(struct inode *inode, struct file *file, bool isdir);
 733
 734struct fuse_file *fuse_file_alloc(struct fuse_conn *fc);
 735struct fuse_file *fuse_file_get(struct fuse_file *ff);
 736void fuse_file_free(struct fuse_file *ff);
 737void fuse_finish_open(struct inode *inode, struct file *file);
 738
 739void fuse_sync_release(struct fuse_file *ff, int flags);
 740
 741/**
 742 * Send RELEASE or RELEASEDIR request
 743 */
 744void fuse_release_common(struct file *file, int opcode);
 745
 746/**
 747 * Send FSYNC or FSYNCDIR request
 748 */
 749int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
 750                      int datasync, int isdir);
 751
 752/**
 753 * Notify poll wakeup
 754 */
 755int fuse_notify_poll_wakeup(struct fuse_conn *fc,
 756                            struct fuse_notify_poll_wakeup_out *outarg);
 757
 758/**
 759 * Initialize file operations on a regular file
 760 */
 761void fuse_init_file_inode(struct inode *inode);
 762
 763/**
 764 * Initialize inode operations on regular files and special files
 765 */
 766void fuse_init_common(struct inode *inode);
 767
 768/**
 769 * Initialize inode and file operations on a directory
 770 */
 771void fuse_init_dir(struct inode *inode);
 772
 773/**
 774 * Initialize inode operations on a symlink
 775 */
 776void fuse_init_symlink(struct inode *inode);
 777
 778/**
 779 * Change attributes of an inode
 780 */
 781void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
 782                            u64 attr_valid, u64 attr_version);
 783
 784void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
 785                                   u64 attr_valid);
 786
 787/**
 788 * Initialize the client device
 789 */
 790int fuse_dev_init(void);
 791
 792/**
 793 * Cleanup the client device
 794 */
 795void fuse_dev_cleanup(void);
 796
 797int fuse_ctl_init(void);
 798void __exit fuse_ctl_cleanup(void);
 799
 800/**
 801 * Allocate a request
 802 */
 803struct fuse_req *fuse_request_alloc(unsigned npages);
 804
 805struct fuse_req *fuse_request_alloc_nofs(unsigned npages);
 806
 807/**
 808 * Free a request
 809 */
 810void fuse_request_free(struct fuse_req *req);
 811
 812/**
 813 * Get a request, may fail with -ENOMEM,
 814 * caller should specify # elements in req->pages[] explicitly
 815 */
 816struct fuse_req *fuse_get_req(struct fuse_conn *fc, unsigned npages);
 817struct fuse_req *fuse_get_req_for_background(struct fuse_conn *fc,
 818                                             unsigned npages);
 819
 820/*
 821 * Increment reference count on request
 822 */
 823void __fuse_get_request(struct fuse_req *req);
 824
 825/**
 826 * Gets a requests for a file operation, always succeeds
 827 */
 828struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc,
 829                                             struct file *file);
 830
 831/**
 832 * Decrement reference count of a request.  If count goes to zero free
 833 * the request.
 834 */
 835void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
 836
 837/**
 838 * Send a request (synchronous)
 839 */
 840void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req);
 841
 842/**
 843 * Simple request sending that does request allocation and freeing
 844 */
 845ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args);
 846
 847/**
 848 * Send a request in the background
 849 */
 850void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req);
 851
 852void fuse_request_send_background_locked(struct fuse_conn *fc,
 853                                         struct fuse_req *req);
 854
 855/* Abort all requests */
 856void fuse_abort_conn(struct fuse_conn *fc);
 857
 858/**
 859 * Invalidate inode attributes
 860 */
 861void fuse_invalidate_attr(struct inode *inode);
 862
 863void fuse_invalidate_entry_cache(struct dentry *entry);
 864
 865void fuse_invalidate_atime(struct inode *inode);
 866
 867/**
 868 * Acquire reference to fuse_conn
 869 */
 870struct fuse_conn *fuse_conn_get(struct fuse_conn *fc);
 871
 872/**
 873 * Initialize fuse_conn
 874 */
 875void fuse_conn_init(struct fuse_conn *fc);
 876
 877/**
 878 * Release reference to fuse_conn
 879 */
 880void fuse_conn_put(struct fuse_conn *fc);
 881
 882struct fuse_dev *fuse_dev_alloc(struct fuse_conn *fc);
 883void fuse_dev_free(struct fuse_dev *fud);
 884
 885/**
 886 * Add connection to control filesystem
 887 */
 888int fuse_ctl_add_conn(struct fuse_conn *fc);
 889
 890/**
 891 * Remove connection from control filesystem
 892 */
 893void fuse_ctl_remove_conn(struct fuse_conn *fc);
 894
 895/**
 896 * Is file type valid?
 897 */
 898int fuse_valid_type(int m);
 899
 900/**
 901 * Is current process allowed to perform filesystem operation?
 902 */
 903int fuse_allow_current_process(struct fuse_conn *fc);
 904
 905u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);
 906
 907void fuse_update_ctime(struct inode *inode);
 908
 909int fuse_update_attributes(struct inode *inode, struct kstat *stat,
 910                           struct file *file, bool *refreshed);
 911
 912void fuse_flush_writepages(struct inode *inode);
 913
 914void fuse_set_nowrite(struct inode *inode);
 915void fuse_release_nowrite(struct inode *inode);
 916
 917u64 fuse_get_attr_version(struct fuse_conn *fc);
 918
 919/**
 920 * File-system tells the kernel to invalidate cache for the given node id.
 921 */
 922int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
 923                             loff_t offset, loff_t len);
 924
 925/**
 926 * File-system tells the kernel to invalidate parent attributes and
 927 * the dentry matching parent/name.
 928 *
 929 * If the child_nodeid is non-zero and:
 930 *    - matches the inode number for the dentry matching parent/name,
 931 *    - is not a mount point
 932 *    - is a file or oan empty directory
 933 * then the dentry is unhashed (d_delete()).
 934 */
 935int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
 936                             u64 child_nodeid, struct qstr *name);
 937
 938int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
 939                 bool isdir);
 940
 941/**
 942 * fuse_direct_io() flags
 943 */
 944
 945/** If set, it is WRITE; otherwise - READ */
 946#define FUSE_DIO_WRITE (1 << 0)
 947
 948/** CUSE pass fuse_direct_io() a file which f_mapping->host is not from FUSE */
 949#define FUSE_DIO_CUSE  (1 << 1)
 950
 951ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
 952                       loff_t *ppos, int flags);
 953long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
 954                   unsigned int flags);
 955long fuse_ioctl_common(struct file *file, unsigned int cmd,
 956                       unsigned long arg, unsigned int flags);
 957unsigned fuse_file_poll(struct file *file, poll_table *wait);
 958int fuse_dev_release(struct inode *inode, struct file *file);
 959
 960bool fuse_write_update_size(struct inode *inode, loff_t pos);
 961
 962int fuse_flush_times(struct inode *inode, struct fuse_file *ff);
 963int fuse_write_inode(struct inode *inode, struct writeback_control *wbc);
 964
 965int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
 966                    struct file *file);
 967
 968void fuse_set_initialized(struct fuse_conn *fc);
 969
 970void fuse_unlock_inode(struct inode *inode);
 971void fuse_lock_inode(struct inode *inode);
 972
 973int fuse_setxattr(struct inode *inode, const char *name, const void *value,
 974                  size_t size, int flags);
 975ssize_t fuse_getxattr(struct inode *inode, const char *name, void *value,
 976                      size_t size);
 977ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size);
 978int fuse_removexattr(struct inode *inode, const char *name);
 979extern const struct xattr_handler *fuse_xattr_handlers[];
 980extern const struct xattr_handler *fuse_acl_xattr_handlers[];
 981
 982struct posix_acl;
 983struct posix_acl *fuse_get_acl(struct inode *inode, int type);
 984int fuse_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 985
 986#endif /* _FS_FUSE_I_H */
 987