]> err.no Git - linux-2.6/blobdiff - fs/fuse/fuse_i.h
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6] / fs / fuse / fuse_i.h
index b4aa8f7bc2c106d521875e4988b91ffa13201de6..0ea5301f86bee8b585d5b8b1085ac3199a674bb4 100644 (file)
 /** If more requests are outstanding, then the operation will block */
 #define FUSE_MAX_OUTSTANDING 10
 
+/** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem
+    module will check permissions based on the file mode.  Otherwise no
+    permission checking is done in the kernel */
+#define FUSE_DEFAULT_PERMISSIONS (1 << 0)
+
+/** If the FUSE_ALLOW_OTHER flag is given, then not only the user
+    doing the mount will be allowed to access the filesystem */
+#define FUSE_ALLOW_OTHER         (1 << 1)
+
+
 /** FUSE inode */
 struct fuse_inode {
        /** Inode data */
@@ -109,6 +119,9 @@ struct fuse_req {
            lists in fuse_conn */
        struct list_head list;
 
+       /** Entry on the background list */
+       struct list_head bg_entry;
+
        /** refcount */
        atomic_t count;
 
@@ -176,15 +189,24 @@ struct fuse_req {
  * unmounted.
  */
 struct fuse_conn {
-       /** The superblock of the mounted filesystem */
-       struct super_block *sb;
-
-       /** The opened client device */
-       struct file *file;
+       /** Reference count */
+       int count;
 
        /** The user id for this mount */
        uid_t user_id;
 
+       /** The group id for this mount */
+       gid_t group_id;
+
+       /** The fuse mount flags for this mount */
+       unsigned flags;
+
+       /** Maximum read size */
+       unsigned max_read;
+
+       /** Maximum write size */
+       unsigned max_write;
+
        /** Readers of the connection are waiting on this */
        wait_queue_head_t waitq;
 
@@ -194,6 +216,10 @@ struct fuse_conn {
        /** The list of requests being processed */
        struct list_head processing;
 
+       /** Requests put in the background (RELEASE or any other
+           interrupted request) */
+       struct list_head background;
+
        /** Controls the maximum number of outstanding requests */
        struct semaphore outstanding_sem;
 
@@ -201,30 +227,55 @@ struct fuse_conn {
            outstanding_sem would go negative */
        unsigned outstanding_debt;
 
+       /** RW semaphore for exclusion with fuse_put_super() */
+       struct rw_semaphore sbput_sem;
+
        /** The list of unused requests */
        struct list_head unused_list;
 
        /** The next unique request id */
        u64 reqctr;
 
+       /** Mount is active */
+       unsigned mounted : 1;
+
+       /** Connection established */
+       unsigned connected : 1;
+
        /** Connection failed (version mismatch) */
        unsigned conn_error : 1;
 
        /** Is fsync not implemented by fs? */
        unsigned no_fsync : 1;
 
+       /** Is fsyncdir not implemented by fs? */
+       unsigned no_fsyncdir : 1;
+
        /** Is flush not implemented by fs? */
        unsigned no_flush : 1;
 
+       /** Is setxattr not implemented by fs? */
+       unsigned no_setxattr : 1;
+
+       /** Is getxattr not implemented by fs? */
+       unsigned no_getxattr : 1;
+
+       /** Is listxattr not implemented by fs? */
+       unsigned no_listxattr : 1;
+
+       /** Is removexattr not implemented by fs? */
+       unsigned no_removexattr : 1;
+
+       /** Is access not implemented by fs? */
+       unsigned no_access : 1;
+
+       /** Is create not implemented by fs? */
+       unsigned no_create : 1;
+
        /** Backing dev info */
        struct backing_dev_info bdi;
 };
 
-struct fuse_getdir_out_i {
-       int fd;
-       void *file; /* Used by kernel only */
-};
-
 static inline struct fuse_conn **get_fuse_conn_super_p(struct super_block *sb)
 {
        return (struct fuse_conn **) &sb->s_fs_info;
@@ -261,6 +312,7 @@ extern struct file_operations fuse_dev_operations;
  *  - the private_data field of the device file
  *  - the s_fs_info field of the super block
  *  - unused_list, pending, processing lists in fuse_conn
+ *  - background list in fuse_conn
  *  - the unique request ID counter reqctr in fuse_conn
  *  - the sb (super_block) field in fuse_conn
  *  - the file (device file) field in fuse_conn
@@ -280,22 +332,56 @@ void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
                      unsigned long nodeid, u64 nlookup);
 
 /**
- * Initialise file operations on a regular file
+ * Send READ or READDIR request
+ */
+size_t fuse_send_read_common(struct fuse_req *req, struct file *file,
+                            struct inode *inode, loff_t pos, size_t count,
+                            int isdir);
+
+/**
+ * Send OPEN or OPENDIR request
+ */
+int fuse_open_common(struct inode *inode, struct file *file, int isdir);
+
+struct fuse_file *fuse_file_alloc(void);
+void fuse_file_free(struct fuse_file *ff);
+void fuse_finish_open(struct inode *inode, struct file *file,
+                     struct fuse_file *ff, struct fuse_open_out *outarg);
+
+/**
+ * Send a RELEASE request
+ */
+void fuse_send_release(struct fuse_conn *fc, struct fuse_file *ff,
+                      u64 nodeid, struct inode *inode, int flags, int isdir);
+
+/**
+ * Send RELEASE or RELEASEDIR request
+ */
+int fuse_release_common(struct inode *inode, struct file *file, int isdir);
+
+/**
+ * Send FSYNC or FSYNCDIR request
+ */
+int fuse_fsync_common(struct file *file, struct dentry *de, int datasync,
+                     int isdir);
+
+/**
+ * Initialize file operations on a regular file
  */
 void fuse_init_file_inode(struct inode *inode);
 
 /**
- * Initialise inode operations on regular files and special files
+ * Initialize inode operations on regular files and special files
  */
 void fuse_init_common(struct inode *inode);
 
 /**
- * Initialise inode and file operations on a directory
+ * Initialize inode and file operations on a directory
  */
 void fuse_init_dir(struct inode *inode);
 
 /**
- * Initialise inode operations on a symlink
+ * Initialize inode operations on a symlink
  */
 void fuse_init_symlink(struct inode *inode);
 
@@ -340,27 +426,17 @@ void fuse_reset_request(struct fuse_req *req);
  */
 struct fuse_req *fuse_get_request(struct fuse_conn *fc);
 
-/**
- * Reserve a preallocated request, only interruptible by SIGKILL
- */
-struct fuse_req *fuse_get_request_nonint(struct fuse_conn *fc);
-
 /**
  * Decrement reference count of a request.  If count goes to zero put
- * on unused list (preallocated) or free reqest (not preallocated).
+ * on unused list (preallocated) or free request (not preallocated).
  */
 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
 
 /**
- * Send a request (synchronous, interruptible)
+ * Send a request (synchronous)
  */
 void request_send(struct fuse_conn *fc, struct fuse_req *req);
 
-/**
- * Send a request (synchronous, non-interruptible except by SIGKILL)
- */
-void request_send_nonint(struct fuse_conn *fc, struct fuse_req *req);
-
 /**
  * Send a request with no reply
  */
@@ -371,6 +447,11 @@ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req);
  */
 void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
 
+/**
+ * Release inodes and file associated with background request
+ */
+void fuse_release_background(struct fuse_req *req);
+
 /**
  * Get the attributes of a file
  */