summaryrefslogtreecommitdiffstats
path: root/fs/afs/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/afs/write.c')
-rw-r--r--fs/afs/write.c30
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);