]> err.no Git - linux-2.6/blobdiff - fs/fuse/file.c
[PATCH] fuse: add asynchronous request support
[linux-2.6] / fs / fuse / file.c
index 63d2980df5c957612c4228b1ae2b70524481969b..043d5b36846d8c7f24464158b60ad3b2a12e92c4 100644 (file)
@@ -113,6 +113,14 @@ int fuse_open_common(struct inode *inode, struct file *file, int isdir)
        return err;
 }
 
+/* Special case for failed iget in CREATE */
+static void fuse_release_end(struct fuse_conn *fc, struct fuse_req *req)
+{
+       u64 nodeid = req->in.h.nodeid;
+       fuse_reset_request(req);
+       fuse_send_forget(fc, req, nodeid, 1);
+}
+
 void fuse_send_release(struct fuse_conn *fc, struct fuse_file *ff,
                       u64 nodeid, struct inode *inode, int flags, int isdir)
 {
@@ -128,6 +136,8 @@ void fuse_send_release(struct fuse_conn *fc, struct fuse_file *ff,
        req->in.args[0].size = sizeof(struct fuse_release_in);
        req->in.args[0].value = inarg;
        request_send_background(fc, req);
+       if (!inode)
+               req->end = fuse_release_end;
        kfree(ff);
 }
 
@@ -267,9 +277,8 @@ size_t fuse_send_read_common(struct fuse_req *req, struct file *file,
        return req->out.args[0].size;
 }
 
-static inline size_t fuse_send_read(struct fuse_req *req, struct file *file,
-                                   struct inode *inode, loff_t pos,
-                                   size_t count)
+static size_t fuse_send_read(struct fuse_req *req, struct file *file,
+                            struct inode *inode, loff_t pos, size_t count)
 {
        return fuse_send_read_common(req, file, inode, pos, count, 0);
 }