]> err.no Git - linux-2.6/blobdiff - fs/fuse/fuse_i.h
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
[linux-2.6] / fs / fuse / fuse_i.h
index ac12b01f44468c52a86dbd934c1d0126909342f1..0dbf96621841506f94ed62ae32260fd077ae19d5 100644 (file)
@@ -65,7 +65,7 @@ struct fuse_inode {
 /** FUSE specific file data */
 struct fuse_file {
        /** Request reserved for flush and release */
-       struct fuse_req *release_req;
+       struct fuse_req *reserved_req;
 
        /** File handle used by userspace */
        u64 fh;
@@ -131,6 +131,7 @@ enum fuse_req_state {
        FUSE_REQ_PENDING,
        FUSE_REQ_READING,
        FUSE_REQ_SENT,
+       FUSE_REQ_WRITING,
        FUSE_REQ_FINISHED
 };
 
@@ -144,9 +145,15 @@ struct fuse_req {
            fuse_conn */
        struct list_head list;
 
+       /** Entry on the interrupts list  */
+       struct list_head intr_entry;
+
        /** refcount */
        atomic_t count;
 
+       /** Unique ID for the interrupt request */
+       u64 intr_unique;
+
        /*
         * The following bitfields are either set once before the
         * request is queued or setting/clearing them is protected by
@@ -159,12 +166,15 @@ struct fuse_req {
        /** Force sending of the request even if interrupted */
        unsigned force:1;
 
-       /** The request was interrupted */
-       unsigned interrupted:1;
+       /** The request was aborted */
+       unsigned aborted:1;
 
        /** Request is sent in the background */
        unsigned background:1;
 
+       /** The request has been interrupted */
+       unsigned interrupted:1;
+
        /** Data is being copied to/from the request */
        unsigned locked:1;
 
@@ -190,6 +200,7 @@ struct fuse_req {
                struct fuse_init_in init_in;
                struct fuse_init_out init_out;
                struct fuse_read_in read_in;
+               struct fuse_lk_in lk_in;
        } misc;
 
        /** page vector */
@@ -212,6 +223,9 @@ struct fuse_req {
 
        /** Request completion callback */
        void (*end)(struct fuse_conn *, struct fuse_req *);
+
+       /** Request is stolen from fuse_file->reserved_req */
+       struct file *stolen_file;
 };
 
 /**
@@ -258,6 +272,9 @@ struct fuse_conn {
        /** Number of requests currently in the background */
        unsigned num_background;
 
+       /** Pending interrupts */
+       struct list_head interrupts;
+
        /** 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 */
@@ -307,12 +324,18 @@ struct fuse_conn {
        /** Is removexattr not implemented by fs? */
        unsigned no_removexattr : 1;
 
+       /** Are file locking primitives not implemented by fs? */
+       unsigned no_lock : 1;
+
        /** Is access not implemented by fs? */
        unsigned no_access : 1;
 
        /** Is create not implemented by fs? */
        unsigned no_create : 1;
 
+       /** Is interrupt not implemented by fs? */
+       unsigned no_interrupt : 1;
+
        /** The number of requests waiting for completion */
        atomic_t num_waiting;
 
@@ -336,6 +359,9 @@ struct fuse_conn {
 
        /** O_ASYNC requests */
        struct fasync_struct *fasync;
+
+       /** Key for lock owner ID scrambling */
+       u32 scramble_key[4];
 };
 
 static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
@@ -452,10 +478,15 @@ struct fuse_req *fuse_request_alloc(void);
 void fuse_request_free(struct fuse_req *req);
 
 /**
- * Reserve a preallocated request
+ * Get a request, may fail with -ENOMEM
  */
 struct fuse_req *fuse_get_req(struct fuse_conn *fc);
 
+/**
+ * Gets a requests for a file operation, always succeeds
+ */
+struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file);
+
 /**
  * Decrement reference count of a request.  If count goes to zero free
  * the request.