aboutsummaryrefslogtreecommitdiffstats
path: root/fs/afs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/afs/file.c')
-rw-r--r--fs/afs/file.c39
1 files changed, 11 insertions, 28 deletions
diff --git a/fs/afs/file.c b/fs/afs/file.c
index 01df30d256b8..6990327e75dd 100644
--- a/fs/afs/file.c
+++ b/fs/afs/file.c
@@ -1,6 +1,6 @@
1/* file.c: AFS filesystem file handling 1/* AFS filesystem file handling
2 * 2 *
3 * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. 3 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com) 4 * Written by David Howells (dhowells@redhat.com)
5 * 5 *
6 * This program is free software; you can redistribute it and/or 6 * This program is free software; you can redistribute it and/or
@@ -15,9 +15,6 @@
15#include <linux/slab.h> 15#include <linux/slab.h>
16#include <linux/fs.h> 16#include <linux/fs.h>
17#include <linux/pagemap.h> 17#include <linux/pagemap.h>
18#include "volume.h"
19#include "vnode.h"
20#include <rxrpc/call.h>
21#include "internal.h" 18#include "internal.h"
22 19
23#if 0 20#if 0
@@ -80,12 +77,10 @@ static void afs_file_readpage_write_complete(void *cookie_data,
80 */ 77 */
81static int afs_file_readpage(struct file *file, struct page *page) 78static int afs_file_readpage(struct file *file, struct page *page)
82{ 79{
83 struct afs_rxfs_fetch_descriptor desc;
84#ifdef AFS_CACHING_SUPPORT
85 struct cachefs_page *pageio;
86#endif
87 struct afs_vnode *vnode; 80 struct afs_vnode *vnode;
88 struct inode *inode; 81 struct inode *inode;
82 size_t len;
83 off_t offset;
89 int ret; 84 int ret;
90 85
91 inode = page->mapping->host; 86 inode = page->mapping->host;
@@ -97,14 +92,10 @@ static int afs_file_readpage(struct file *file, struct page *page)
97 BUG_ON(!PageLocked(page)); 92 BUG_ON(!PageLocked(page));
98 93
99 ret = -ESTALE; 94 ret = -ESTALE;
100 if (vnode->flags & AFS_VNODE_DELETED) 95 if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
101 goto error; 96 goto error;
102 97
103#ifdef AFS_CACHING_SUPPORT 98#ifdef AFS_CACHING_SUPPORT
104 ret = cachefs_page_get_private(page, &pageio, GFP_NOIO);
105 if (ret < 0)
106 goto error;
107
108 /* is it cached? */ 99 /* is it cached? */
109 ret = cachefs_read_or_alloc_page(vnode->cache, 100 ret = cachefs_read_or_alloc_page(vnode->cache,
110 page, 101 page,
@@ -128,26 +119,19 @@ static int afs_file_readpage(struct file *file, struct page *page)
128 case -ENOBUFS: 119 case -ENOBUFS:
129 case -ENODATA: 120 case -ENODATA:
130 default: 121 default:
131 desc.fid = vnode->fid; 122 offset = page->index << PAGE_CACHE_SHIFT;
132 desc.offset = page->index << PAGE_CACHE_SHIFT; 123 len = min_t(size_t, i_size_read(inode) - offset, PAGE_SIZE);
133 desc.size = min((size_t) (inode->i_size - desc.offset),
134 (size_t) PAGE_SIZE);
135 desc.buffer = kmap(page);
136
137 clear_page(desc.buffer);
138 124
139 /* read the contents of the file from the server into the 125 /* read the contents of the file from the server into the
140 * page */ 126 * page */
141 ret = afs_vnode_fetch_data(vnode, &desc); 127 ret = afs_vnode_fetch_data(vnode, offset, len, page);
142 kunmap(page);
143 if (ret < 0) { 128 if (ret < 0) {
144 if (ret==-ENOENT) { 129 if (ret == -ENOENT) {
145 _debug("got NOENT from server" 130 _debug("got NOENT from server"
146 " - marking file deleted and stale"); 131 " - marking file deleted and stale");
147 vnode->flags |= AFS_VNODE_DELETED; 132 set_bit(AFS_VNODE_DELETED, &vnode->flags);
148 ret = -ESTALE; 133 ret = -ESTALE;
149 } 134 }
150
151#ifdef AFS_CACHING_SUPPORT 135#ifdef AFS_CACHING_SUPPORT
152 cachefs_uncache_page(vnode->cache, page); 136 cachefs_uncache_page(vnode->cache, page);
153#endif 137#endif
@@ -174,10 +158,9 @@ static int afs_file_readpage(struct file *file, struct page *page)
174 _leave(" = 0"); 158 _leave(" = 0");
175 return 0; 159 return 0;
176 160
177 error: 161error:
178 SetPageError(page); 162 SetPageError(page);
179 unlock_page(page); 163 unlock_page(page);
180
181 _leave(" = %d", ret); 164 _leave(" = %d", ret);
182 return ret; 165 return ret;
183} 166}