return 0;
 }
 
-static size_t fuse_send_readdir(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, 1);
-}
-
 static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
 {
        int err;
        }
        req->num_pages = 1;
        req->pages[0] = page;
-       nbytes = fuse_send_readdir(req, file, inode, file->f_pos, PAGE_SIZE);
+       fuse_read_fill(req, file, inode, file->f_pos, PAGE_SIZE, FUSE_READDIR);
+       request_send(fc, req);
+       nbytes = req->out.args[0].size;
        err = req->out.h.error;
        fuse_put_request(fc, req);
        if (!err)
 
        return fuse_fsync_common(file, de, datasync, 0);
 }
 
-size_t fuse_send_read_common(struct fuse_req *req, struct file *file,
-                            struct inode *inode, loff_t pos, size_t count,
-                            int isdir)
+void fuse_read_fill(struct fuse_req *req, struct file *file,
+                   struct inode *inode, loff_t pos, size_t count, int opcode)
 {
-       struct fuse_conn *fc = get_fuse_conn(inode);
        struct fuse_file *ff = file->private_data;
-       struct fuse_read_in inarg;
+       struct fuse_read_in *inarg = &req->misc.read_in;
 
-       memset(&inarg, 0, sizeof(struct fuse_read_in));
-       inarg.fh = ff->fh;
-       inarg.offset = pos;
-       inarg.size = count;
-       req->in.h.opcode = isdir ? FUSE_READDIR : FUSE_READ;
+       inarg->fh = ff->fh;
+       inarg->offset = pos;
+       inarg->size = count;
+       req->in.h.opcode = opcode;
        req->in.h.nodeid = get_node_id(inode);
        req->inode = inode;
        req->file = file;
        req->out.argvar = 1;
        req->out.numargs = 1;
        req->out.args[0].size = count;
-       request_send(fc, req);
-       return req->out.args[0].size;
 }
 
 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);
+       struct fuse_conn *fc = get_fuse_conn(inode);
+       fuse_read_fill(req, file, inode, pos, count, FUSE_READ);
+       request_send(fc, req);
+       return req->out.args[0].size;
 }
 
 static int fuse_readpage(struct file *file, struct page *page)
 
                struct fuse_release_in release_in;
                struct fuse_init_in init_in;
                struct fuse_init_out init_out;
+               struct fuse_read_in read_in;
        } misc;
 
        /** page vector */
                      unsigned long nodeid, u64 nlookup);
 
 /**
- * Send READ or READDIR request
+ * Initialize 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);
+void fuse_read_fill(struct fuse_req *req, struct file *file,
+                   struct inode *inode, loff_t pos, size_t count, int opcode);
 
 /**
  * Send OPEN or OPENDIR request