[PATCH] fuse: clean up request accounting
[deliverable/linux.git] / fs / fuse / fuse_i.h
index 4a83adfec968ebae108b9ae71802e14db6ef6dbb..242e69cb12517c017975fea7489b9736277172b4 100644 (file)
@@ -1,6 +1,6 @@
 /*
   FUSE: Filesystem in Userspace
 /*
   FUSE: Filesystem in Userspace
-  Copyright (C) 2001-2005  Miklos Szeredi <miklos@szeredi.hu>
+  Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
 
   This program can be distributed under the terms of the GNU GPL.
   See the file COPYING.
 
   This program can be distributed under the terms of the GNU GPL.
   See the file COPYING.
@@ -18,9 +18,6 @@
 /** Max number of pages that can be used in a single read request */
 #define FUSE_MAX_PAGES_PER_REQ 32
 
 /** Max number of pages that can be used in a single read request */
 #define FUSE_MAX_PAGES_PER_REQ 32
 
-/** If more requests are outstanding, then the operation will block */
-#define FUSE_MAX_OUTSTANDING 10
-
 /** It could be as large as PATH_MAX, but would that have any uses? */
 #define FUSE_NAME_MAX 1024
 
 /** It could be as large as PATH_MAX, but would that have any uses? */
 #define FUSE_NAME_MAX 1024
 
@@ -131,8 +128,8 @@ struct fuse_conn;
  * A request to the client
  */
 struct fuse_req {
  * A request to the client
  */
 struct fuse_req {
-       /** This can be on either unused_list, pending processing or
-           io lists in fuse_conn */
+       /** This can be on either pending processing or io lists in
+           fuse_conn */
        struct list_head list;
 
        /** Entry on the background list */
        struct list_head list;
 
        /** Entry on the background list */
@@ -144,15 +141,12 @@ struct fuse_req {
        /*
         * The following bitfields are either set once before the
         * request is queued or setting/clearing them is protected by
        /*
         * The following bitfields are either set once before the
         * request is queued or setting/clearing them is protected by
-        * fuse_lock
+        * fuse_conn->lock
         */
 
        /** True if the request has reply */
        unsigned isreply:1;
 
         */
 
        /** True if the request has reply */
        unsigned isreply:1;
 
-       /** The request is preallocated */
-       unsigned preallocated:1;
-
        /** The request was interrupted */
        unsigned interrupted:1;
 
        /** The request was interrupted */
        unsigned interrupted:1;
 
@@ -213,6 +207,9 @@ struct fuse_req {
  * unmounted.
  */
 struct fuse_conn {
  * unmounted.
  */
 struct fuse_conn {
+       /** Lock protecting accessess to  members of this structure */
+       spinlock_t lock;
+
        /** The user id for this mount */
        uid_t user_id;
 
        /** The user id for this mount */
        uid_t user_id;
 
@@ -244,19 +241,9 @@ struct fuse_conn {
            interrupted request) */
        struct list_head background;
 
            interrupted request) */
        struct list_head background;
 
-       /** Controls the maximum number of outstanding requests */
-       struct semaphore outstanding_sem;
-
-       /** This counts the number of outstanding requests if
-           outstanding_sem would go negative */
-       unsigned outstanding_debt;
-
        /** RW semaphore for exclusion with fuse_put_super() */
        struct rw_semaphore sbput_sem;
 
        /** 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;
 
        /** The next unique request id */
        u64 reqctr;
 
@@ -318,6 +305,9 @@ struct fuse_conn {
 
        /** kobject */
        struct kobject kobj;
 
        /** kobject */
        struct kobject kobj;
+
+       /** O_ASYNC requests */
+       struct fasync_struct *fasync;
 };
 
 static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
 };
 
 static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
@@ -346,22 +336,7 @@ static inline u64 get_node_id(struct inode *inode)
 }
 
 /** Device operations */
 }
 
 /** Device operations */
-extern struct file_operations fuse_dev_operations;
-
-/**
- * This is the single global spinlock which protects FUSE's structures
- *
- * The following data is protected by this lock:
- *
- *  - 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
- */
-extern spinlock_t fuse_lock;
+extern const struct file_operations fuse_dev_operations;
 
 /**
  * Get a filled in inode
 
 /**
  * Get a filled in inode
@@ -461,11 +436,11 @@ void fuse_reset_request(struct fuse_req *req);
 /**
  * Reserve a preallocated request
  */
 /**
  * Reserve a preallocated request
  */
-struct fuse_req *fuse_get_request(struct fuse_conn *fc);
+struct fuse_req *fuse_get_req(struct fuse_conn *fc);
 
 /**
 
 /**
- * Decrement reference count of a request.  If count goes to zero put
- * on unused list (preallocated) or free request (not preallocated).
+ * Decrement reference count of a request.  If count goes to zero free
+ * the request.
  */
 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
 
  */
 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
 
@@ -487,7 +462,7 @@ void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
 /**
  * Release inodes and file associated with background request
  */
 /**
  * Release inodes and file associated with background request
  */
-void fuse_release_background(struct fuse_req *req);
+void fuse_release_background(struct fuse_conn *fc, struct fuse_req *req);
 
 /* Abort all requests */
 void fuse_abort_conn(struct fuse_conn *fc);
 
 /* Abort all requests */
 void fuse_abort_conn(struct fuse_conn *fc);
This page took 0.034499 seconds and 5 git commands to generate.