/*
FUSE: Filesystem in Userspace
- Copyright (C) 2001-2006 Miklos Szeredi <miklos@szeredi.hu>
+ Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu>
This program can be distributed under the terms of the GNU GPL.
See the file COPYING.
#include <linux/slab.h>
#include <linux/kernel.h>
-static const struct file_operations fuse_direct_io_file_operations;
+static struct file_operations fuse_direct_io_file_operations;
static int fuse_send_open(struct inode *inode, struct file *file, int isdir,
struct fuse_open_out *outargp)
struct fuse_req *req;
int err;
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- return PTR_ERR(req);
+ req = fuse_get_request(fc);
+ if (!req)
+ return -EINTR;
memset(&inarg, 0, sizeof(inarg));
inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
if (fc->no_flush)
return 0;
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- return PTR_ERR(req);
+ req = fuse_get_request(fc);
+ if (!req)
+ return -EINTR;
memset(&inarg, 0, sizeof(inarg));
inarg.fh = ff->fh;
if ((!isdir && fc->no_fsync) || (isdir && fc->no_fsyncdir))
return 0;
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- return PTR_ERR(req);
+ req = fuse_get_request(fc);
+ if (!req)
+ return -EINTR;
memset(&inarg, 0, sizeof(inarg));
inarg.fh = ff->fh;
if (is_bad_inode(inode))
goto out;
- req = fuse_get_req(fc);
- err = PTR_ERR(req);
- if (IS_ERR(req))
+ err = -EINTR;
+ req = fuse_get_request(fc);
+ if (!req)
goto out;
req->out.page_zeroing = 1;
(req->num_pages + 1) * PAGE_CACHE_SIZE > fc->max_read ||
req->pages[req->num_pages - 1]->index + 1 != page->index)) {
fuse_send_readpages(req, data->file, inode);
- data->req = req = fuse_get_req(fc);
- if (IS_ERR(req)) {
+ data->req = req = fuse_get_request(fc);
+ if (!req) {
unlock_page(page);
- return PTR_ERR(req);
+ return -EINTR;
}
}
req->pages[req->num_pages] = page;
data.file = file;
data.inode = inode;
- data.req = fuse_get_req(fc);
- if (IS_ERR(data.req))
- return PTR_ERR(data.req);
+ data.req = fuse_get_request(fc);
+ if (!data.req)
+ return -EINTR;
err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
if (!err) {
if (is_bad_inode(inode))
return -EIO;
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- return PTR_ERR(req);
+ req = fuse_get_request(fc);
+ if (!req)
+ return -EINTR;
req->num_pages = 1;
req->pages[0] = page;
err = -EIO;
if (!err) {
pos += count;
- if (pos > i_size_read(inode))
+ spin_lock(&fuse_lock);
+ if (pos > inode->i_size)
i_size_write(inode, pos);
+ spin_unlock(&fuse_lock);
if (offset == 0 && to == PAGE_CACHE_SIZE) {
clear_page_dirty(page);
if (is_bad_inode(inode))
return -EIO;
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- return PTR_ERR(req);
+ req = fuse_get_request(fc);
+ if (!req)
+ return -EINTR;
while (count) {
size_t nres;
buf += nres;
if (nres != nbytes)
break;
- if (count) {
- fuse_put_request(fc, req);
- req = fuse_get_req(fc);
- if (IS_ERR(req))
- break;
- }
+ if (count)
+ fuse_reset_request(req);
}
fuse_put_request(fc, req);
if (res > 0) {
- if (write && pos > i_size_read(inode))
- i_size_write(inode, pos);
+ if (write) {
+ spin_lock(&fuse_lock);
+ if (pos > inode->i_size)
+ i_size_write(inode, pos);
+ spin_unlock(&fuse_lock);
+ }
*ppos = pos;
}
fuse_invalidate_attr(inode);
return 0;
}
-static const struct file_operations fuse_file_operations = {
+static struct file_operations fuse_file_operations = {
.llseek = generic_file_llseek,
.read = generic_file_read,
.write = generic_file_write,
.sendfile = generic_file_sendfile,
};
-static const struct file_operations fuse_direct_io_file_operations = {
+static struct file_operations fuse_direct_io_file_operations = {
.llseek = generic_file_llseek,
.read = fuse_direct_read,
.write = fuse_direct_write,