diff options
Diffstat (limited to 'fs/afs/file.c')
-rw-r--r-- | fs/afs/file.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/afs/file.c b/fs/afs/file.c index ba7b71fba34b..0d5b8508869b 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c | |||
@@ -30,6 +30,7 @@ static int afs_readpages(struct file *filp, struct address_space *mapping, | |||
30 | 30 | ||
31 | const struct file_operations afs_file_operations = { | 31 | const struct file_operations afs_file_operations = { |
32 | .open = afs_open, | 32 | .open = afs_open, |
33 | .flush = afs_flush, | ||
33 | .release = afs_release, | 34 | .release = afs_release, |
34 | .llseek = generic_file_llseek, | 35 | .llseek = generic_file_llseek, |
35 | .read_iter = generic_file_read_iter, | 36 | .read_iter = generic_file_read_iter, |
@@ -184,10 +185,13 @@ int afs_page_filler(void *data, struct page *page) | |||
184 | if (!req) | 185 | if (!req) |
185 | goto enomem; | 186 | goto enomem; |
186 | 187 | ||
188 | /* We request a full page. If the page is a partial one at the | ||
189 | * end of the file, the server will return a short read and the | ||
190 | * unmarshalling code will clear the unfilled space. | ||
191 | */ | ||
187 | atomic_set(&req->usage, 1); | 192 | atomic_set(&req->usage, 1); |
188 | req->pos = (loff_t)page->index << PAGE_SHIFT; | 193 | req->pos = (loff_t)page->index << PAGE_SHIFT; |
189 | req->len = min_t(size_t, i_size_read(inode) - req->pos, | 194 | req->len = PAGE_SIZE; |
190 | PAGE_SIZE); | ||
191 | req->nr_pages = 1; | 195 | req->nr_pages = 1; |
192 | req->pages[0] = page; | 196 | req->pages[0] = page; |
193 | get_page(page); | 197 | get_page(page); |
@@ -208,7 +212,13 @@ int afs_page_filler(void *data, struct page *page) | |||
208 | fscache_uncache_page(vnode->cache, page); | 212 | fscache_uncache_page(vnode->cache, page); |
209 | #endif | 213 | #endif |
210 | BUG_ON(PageFsCache(page)); | 214 | BUG_ON(PageFsCache(page)); |
211 | goto error; | 215 | |
216 | if (ret == -EINTR || | ||
217 | ret == -ENOMEM || | ||
218 | ret == -ERESTARTSYS || | ||
219 | ret == -EAGAIN) | ||
220 | goto error; | ||
221 | goto io_error; | ||
212 | } | 222 | } |
213 | 223 | ||
214 | SetPageUptodate(page); | 224 | SetPageUptodate(page); |
@@ -227,10 +237,12 @@ int afs_page_filler(void *data, struct page *page) | |||
227 | _leave(" = 0"); | 237 | _leave(" = 0"); |
228 | return 0; | 238 | return 0; |
229 | 239 | ||
240 | io_error: | ||
241 | SetPageError(page); | ||
242 | goto error; | ||
230 | enomem: | 243 | enomem: |
231 | ret = -ENOMEM; | 244 | ret = -ENOMEM; |
232 | error: | 245 | error: |
233 | SetPageError(page); | ||
234 | unlock_page(page); | 246 | unlock_page(page); |
235 | _leave(" = %d", ret); | 247 | _leave(" = %d", ret); |
236 | return ret; | 248 | return ret; |