Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / fs / afs / write.c
index 19c04caf3c012bd777d20e31355357154cc38a83..72efcfcf9f95efd2b5cae1257a8d01247367ebeb 100644 (file)
@@ -33,10 +33,21 @@ static int afs_fill_page(struct afs_vnode *vnode, struct key *key,
                         loff_t pos, unsigned int len, struct page *page)
 {
        struct afs_read *req;
+       size_t p;
+       void *data;
        int ret;
 
        _enter(",,%llu", (unsigned long long)pos);
 
+       if (pos >= vnode->vfs_inode.i_size) {
+               p = pos & ~PAGE_MASK;
+               ASSERTCMP(p + len, <=, PAGE_SIZE);
+               data = kmap(page);
+               memset(data + p, 0, len);
+               kunmap(page);
+               return 0;
+       }
+
        req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *),
                      GFP_KERNEL);
        if (!req)
@@ -81,7 +92,7 @@ int afs_write_begin(struct file *file, struct address_space *mapping,
        pgoff_t index = pos >> PAGE_SHIFT;
        int ret;
 
-       _enter("{%x:%u},{%lx},%u,%u",
+       _enter("{%llx:%llu},{%lx},%u,%u",
               vnode->fid.vid, vnode->fid.vnode, index, from, to);
 
        /* 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,
        loff_t i_size, maybe_i_size;
        int ret;
 
-       _enter("{%x:%u},{%lx}",
+       _enter("{%llx:%llu},{%lx}",
               vnode->fid.vid, vnode->fid.vnode, page->index);
 
        maybe_i_size = pos + copied;
@@ -230,7 +241,7 @@ static void afs_kill_pages(struct address_space *mapping,
        struct pagevec pv;
        unsigned count, loop;
 
-       _enter("{%x:%u},%lx-%lx",
+       _enter("{%llx:%llu},%lx-%lx",
               vnode->fid.vid, vnode->fid.vnode, first, last);
 
        pagevec_init(&pv);
@@ -272,7 +283,7 @@ static void afs_redirty_pages(struct writeback_control *wbc,
        struct pagevec pv;
        unsigned count, loop;
 
-       _enter("{%x:%u},%lx-%lx",
+       _enter("{%llx:%llu},%lx-%lx",
               vnode->fid.vid, vnode->fid.vnode, first, last);
 
        pagevec_init(&pv);
@@ -314,7 +325,7 @@ static int afs_store_data(struct address_space *mapping,
        struct list_head *p;
        int ret = -ENOKEY, ret2;
 
-       _enter("%s{%x:%u.%u},%lx,%lx,%x,%x",
+       _enter("%s{%llx:%llu.%u},%lx,%lx,%x,%x",
               vnode->volume->name,
               vnode->fid.vid,
               vnode->fid.vnode,
@@ -533,6 +544,7 @@ no_more:
        case -ENOENT:
        case -ENOMEDIUM:
        case -ENXIO:
+               trace_afs_file_error(vnode, ret, afs_file_error_writeback_fail);
                afs_kill_pages(mapping, first, last);
                mapping_set_error(mapping, ret);
                break;
@@ -675,7 +687,7 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
        unsigned count, loop;
        pgoff_t first = call->first, last = call->last;
 
-       _enter("{%x:%u},{%lx-%lx}",
+       _enter("{%llx:%llu},{%lx-%lx}",
               vnode->fid.vid, vnode->fid.vnode, first, last);
 
        pagevec_init(&pv);
@@ -714,7 +726,7 @@ ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from)
        ssize_t result;
        size_t count = iov_iter_count(from);
 
-       _enter("{%x.%u},{%zu},",
+       _enter("{%llx:%llu},{%zu},",
               vnode->fid.vid, vnode->fid.vnode, count);
 
        if (IS_SWAPFILE(&vnode->vfs_inode)) {
@@ -742,7 +754,7 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
        struct inode *inode = file_inode(file);
        struct afs_vnode *vnode = AFS_FS_I(inode);
 
-       _enter("{%x:%u},{n=%pD},%d",
+       _enter("{%llx:%llu},{n=%pD},%d",
               vnode->fid.vid, vnode->fid.vnode, file,
               datasync);
 
@@ -760,7 +772,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf)
        struct afs_vnode *vnode = AFS_FS_I(inode);
        unsigned long priv;
 
-       _enter("{{%x:%u}},{%lx}",
+       _enter("{{%llx:%llu}},{%lx}",
               vnode->fid.vid, vnode->fid.vnode, vmf->page->index);
 
        sb_start_pagefault(inode->i_sb);