aboutsummaryrefslogtreecommitdiff
path: root/kernel/file.c
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2006-08-18 16:38:08 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2006-08-18 16:38:08 +0000
commit63d3c40e1fa56176a61df9ea6d430de4362aa77b (patch)
treeb65ce256843fb050cff885057887f07b6a76094b /kernel/file.c
parentad51956d5b2505420eaec99895df5c8f87fd1993 (diff)
fix
Diffstat (limited to 'kernel/file.c')
-rw-r--r--kernel/file.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/kernel/file.c b/kernel/file.c
index 42e56f0..61eba56 100644
--- a/kernel/file.c
+++ b/kernel/file.c
@@ -393,21 +393,32 @@ static int fuse_readpages_fill(void *_data, struct page *page)
struct fuse_req *req = data->req;
struct inode *inode = data->inode;
struct fuse_conn *fc = get_fuse_conn(inode);
+ int err;
- if (req->num_pages &&
+ if (req && req->num_pages &&
(req->num_pages == FUSE_MAX_PAGES_PER_REQ ||
(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);
+ req = NULL;
+ }
+ if (!req) {
+ err = -EIO;
+ if (is_bad_inode(inode))
+ goto out_unlock_page;
+
data->req = req = fuse_get_req(fc);
- if (IS_ERR(req)) {
- unlock_page(page);
- return PTR_ERR(req);
- }
+ err = PTR_ERR(req);
+ if (IS_ERR(req))
+ goto out_unlock_page;
}
req->pages[req->num_pages] = page;
req->num_pages ++;
return 0;
+
+ out_unlock_page:
+ unlock_page(page);
+ return err;
}
static int fuse_readpages(struct file *file, struct address_space *mapping,
@@ -418,14 +429,9 @@ static int fuse_readpages(struct file *file, struct address_space *mapping,
struct fuse_readpages_data data;
int err;
- if (is_bad_inode(inode))
- return -EIO;
-
data.file = file;
data.inode = inode;
- data.req = fuse_get_req(fc);
- if (IS_ERR(data.req))
- return PTR_ERR(data.req);
+ data.req = NULL;
err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
if (!err) {