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; |
