]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/fuse/fuse_i.h
Merge tag 'usb-3.11-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[karo-tx-linux.git] / fs / fuse / fuse_i.h
index 6aeba864f07060dd28ae113ae57d3c98cdf000a5..fde7249a3a9608c8c6e49be4316a1d155b7cdfba 100644 (file)
@@ -228,6 +228,20 @@ enum fuse_req_state {
        FUSE_REQ_FINISHED
 };
 
+/** The request IO state (for asynchronous processing) */
+struct fuse_io_priv {
+       int async;
+       spinlock_t lock;
+       unsigned reqs;
+       ssize_t bytes;
+       size_t size;
+       __u64 offset;
+       bool write;
+       int err;
+       struct kiocb *iocb;
+       struct file *file;
+};
+
 /**
  * A request to the client
  */
@@ -332,6 +346,9 @@ struct fuse_req {
        /** Inode used in the request or NULL */
        struct inode *inode;
 
+       /** AIO control block */
+       struct fuse_io_priv *io;
+
        /** Link on fi->writepages */
        struct list_head writepages_entry;
 
@@ -417,6 +434,10 @@ struct fuse_conn {
        /** Batching of FORGET requests (positive indicates FORGET batch) */
        int forget_batch;
 
+       /** Flag indicating that INIT reply has been received. Allocating
+        * any fuse request will be suspended until the flag is set */
+       int initialized;
+
        /** Flag indicating if connection is blocked.  This will be
            the case before the INIT reply is received, and if there
            are too many outstading backgrounds requests */
@@ -520,6 +541,9 @@ struct fuse_conn {
        /** Does the filesystem want adaptive readdirplus? */
        unsigned readdirplus_auto:1;
 
+       /** Does the filesystem support asynchronous direct-IO submission? */
+       unsigned async_dio:1;
+
        /** The number of requests waiting for completion */
        atomic_t num_waiting;
 
@@ -708,6 +732,13 @@ void fuse_request_free(struct fuse_req *req);
  * caller should specify # elements in req->pages[] explicitly
  */
 struct fuse_req *fuse_get_req(struct fuse_conn *fc, unsigned npages);
+struct fuse_req *fuse_get_req_for_background(struct fuse_conn *fc,
+                                            unsigned npages);
+
+/*
+ * Increment reference count on request
+ */
+void __fuse_get_request(struct fuse_req *req);
 
 /**
  * Get a request, may fail with -ENOMEM,
@@ -823,7 +854,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
 
 int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
                 bool isdir);
-ssize_t fuse_direct_io(struct file *file, const struct iovec *iov,
+ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov,
                       unsigned long nr_segs, size_t count, loff_t *ppos,
                       int write);
 long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
@@ -835,4 +866,7 @@ int fuse_dev_release(struct inode *inode, struct file *file);
 
 void fuse_write_update_size(struct inode *inode, loff_t pos);
 
+int fuse_do_setattr(struct inode *inode, struct iattr *attr,
+                   struct file *file);
+
 #endif /* _FS_FUSE_I_H */