diff options
Diffstat (limited to 'fs/afs/write.c')
-rw-r--r-- | fs/afs/write.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/fs/afs/write.c b/fs/afs/write.c index 19c04caf3c01..72efcfcf9f95 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c | |||
@@ -33,10 +33,21 @@ static int afs_fill_page(struct afs_vnode *vnode, struct key *key, | |||
33 | loff_t pos, unsigned int len, struct page *page) | 33 | loff_t pos, unsigned int len, struct page *page) |
34 | { | 34 | { |
35 | struct afs_read *req; | 35 | struct afs_read *req; |
36 | size_t p; | ||
37 | void *data; | ||
36 | int ret; | 38 | int ret; |
37 | 39 | ||
38 | _enter(",,%llu", (unsigned long long)pos); | 40 | _enter(",,%llu", (unsigned long long)pos); |
39 | 41 | ||
42 | if (pos >= vnode->vfs_inode.i_size) { | ||
43 | p = pos & ~PAGE_MASK; | ||
44 | ASSERTCMP(p + len, <=, PAGE_SIZE); | ||
45 | data = kmap(page); | ||
46 | memset(data + p, 0, len); | ||
47 | kunmap(page); | ||
48 | return 0; | ||
49 | } | ||
50 | |||
40 | req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *), | 51 | req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *), |
41 | GFP_KERNEL); | 52 | GFP_KERNEL); |
42 | if (!req) | 53 | if (!req) |
@@ -81,7 +92,7 @@ int afs_write_begin(struct file *file, struct address_space *mapping, | |||
81 | pgoff_t index = pos >> PAGE_SHIFT; | 92 | pgoff_t index = pos >> PAGE_SHIFT; |
82 | int ret; | 93 | int ret; |
83 | 94 | ||
84 | _enter("{%x:%u},{%lx},%u,%u", | 95 | _enter("{%llx:%llu},{%lx},%u,%u", |
85 | vnode->fid.vid, vnode->fid.vnode, index, from, to); | 96 | vnode->fid.vid, vnode->fid.vnode, index, from, to); |
86 | 97 | ||
87 | /* We want to store information about how much of a page is altered in | 98 | /* We want to store information about how much of a page is altered in |
@@ -181,7 +192,7 @@ int afs_write_end(struct file *file, struct address_space *mapping, | |||
181 | loff_t i_size, maybe_i_size; | 192 | loff_t i_size, maybe_i_size; |
182 | int ret; | 193 | int ret; |
183 | 194 | ||
184 | _enter("{%x:%u},{%lx}", | 195 | _enter("{%llx:%llu},{%lx}", |
185 | vnode->fid.vid, vnode->fid.vnode, page->index); | 196 | vnode->fid.vid, vnode->fid.vnode, page->index); |
186 | 197 | ||
187 | maybe_i_size = pos + copied; | 198 | maybe_i_size = pos + copied; |
@@ -230,7 +241,7 @@ static void afs_kill_pages(struct address_space *mapping, | |||
230 | struct pagevec pv; | 241 | struct pagevec pv; |
231 | unsigned count, loop; | 242 | unsigned count, loop; |
232 | 243 | ||
233 | _enter("{%x:%u},%lx-%lx", | 244 | _enter("{%llx:%llu},%lx-%lx", |
234 | vnode->fid.vid, vnode->fid.vnode, first, last); | 245 | vnode->fid.vid, vnode->fid.vnode, first, last); |
235 | 246 | ||
236 | pagevec_init(&pv); | 247 | pagevec_init(&pv); |
@@ -272,7 +283,7 @@ static void afs_redirty_pages(struct writeback_control *wbc, | |||
272 | struct pagevec pv; | 283 | struct pagevec pv; |
273 | unsigned count, loop; | 284 | unsigned count, loop; |
274 | 285 | ||
275 | _enter("{%x:%u},%lx-%lx", | 286 | _enter("{%llx:%llu},%lx-%lx", |
276 | vnode->fid.vid, vnode->fid.vnode, first, last); | 287 | vnode->fid.vid, vnode->fid.vnode, first, last); |
277 | 288 | ||
278 | pagevec_init(&pv); | 289 | pagevec_init(&pv); |
@@ -314,7 +325,7 @@ static int afs_store_data(struct address_space *mapping, | |||
314 | struct list_head *p; | 325 | struct list_head *p; |
315 | int ret = -ENOKEY, ret2; | 326 | int ret = -ENOKEY, ret2; |
316 | 327 | ||
317 | _enter("%s{%x:%u.%u},%lx,%lx,%x,%x", | 328 | _enter("%s{%llx:%llu.%u},%lx,%lx,%x,%x", |
318 | vnode->volume->name, | 329 | vnode->volume->name, |
319 | vnode->fid.vid, | 330 | vnode->fid.vid, |
320 | vnode->fid.vnode, | 331 | vnode->fid.vnode, |
@@ -533,6 +544,7 @@ no_more: | |||
533 | case -ENOENT: | 544 | case -ENOENT: |
534 | case -ENOMEDIUM: | 545 | case -ENOMEDIUM: |
535 | case -ENXIO: | 546 | case -ENXIO: |
547 | trace_afs_file_error(vnode, ret, afs_file_error_writeback_fail); | ||
536 | afs_kill_pages(mapping, first, last); | 548 | afs_kill_pages(mapping, first, last); |
537 | mapping_set_error(mapping, ret); | 549 | mapping_set_error(mapping, ret); |
538 | break; | 550 | break; |
@@ -675,7 +687,7 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call) | |||
675 | unsigned count, loop; | 687 | unsigned count, loop; |
676 | pgoff_t first = call->first, last = call->last; | 688 | pgoff_t first = call->first, last = call->last; |
677 | 689 | ||
678 | _enter("{%x:%u},{%lx-%lx}", | 690 | _enter("{%llx:%llu},{%lx-%lx}", |
679 | vnode->fid.vid, vnode->fid.vnode, first, last); | 691 | vnode->fid.vid, vnode->fid.vnode, first, last); |
680 | 692 | ||
681 | pagevec_init(&pv); | 693 | pagevec_init(&pv); |
@@ -714,7 +726,7 @@ ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from) | |||
714 | ssize_t result; | 726 | ssize_t result; |
715 | size_t count = iov_iter_count(from); | 727 | size_t count = iov_iter_count(from); |
716 | 728 | ||
717 | _enter("{%x.%u},{%zu},", | 729 | _enter("{%llx:%llu},{%zu},", |
718 | vnode->fid.vid, vnode->fid.vnode, count); | 730 | vnode->fid.vid, vnode->fid.vnode, count); |
719 | 731 | ||
720 | if (IS_SWAPFILE(&vnode->vfs_inode)) { | 732 | if (IS_SWAPFILE(&vnode->vfs_inode)) { |
@@ -742,7 +754,7 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
742 | struct inode *inode = file_inode(file); | 754 | struct inode *inode = file_inode(file); |
743 | struct afs_vnode *vnode = AFS_FS_I(inode); | 755 | struct afs_vnode *vnode = AFS_FS_I(inode); |
744 | 756 | ||
745 | _enter("{%x:%u},{n=%pD},%d", | 757 | _enter("{%llx:%llu},{n=%pD},%d", |
746 | vnode->fid.vid, vnode->fid.vnode, file, | 758 | vnode->fid.vid, vnode->fid.vnode, file, |
747 | datasync); | 759 | datasync); |
748 | 760 | ||
@@ -760,7 +772,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf) | |||
760 | struct afs_vnode *vnode = AFS_FS_I(inode); | 772 | struct afs_vnode *vnode = AFS_FS_I(inode); |
761 | unsigned long priv; | 773 | unsigned long priv; |
762 | 774 | ||
763 | _enter("{{%x:%u}},{%lx}", | 775 | _enter("{{%llx:%llu}},{%lx}", |
764 | vnode->fid.vid, vnode->fid.vnode, vmf->page->index); | 776 | vnode->fid.vid, vnode->fid.vnode, vmf->page->index); |
765 | 777 | ||
766 | sb_start_pagefault(inode->i_sb); | 778 | sb_start_pagefault(inode->i_sb); |