summaryrefslogtreecommitdiffstats
path: root/fs/nfs/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r--fs/nfs/write.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index a13e26fd0..5f847bec8 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -416,9 +416,23 @@ wait_on_write_request(struct nfs_wreq *req)
int
nfs_writepage(struct dentry * dentry, struct page *page)
{
- int result = nfs_writepage_sync(dentry, dentry->d_inode, page, 0, PAGE_SIZE);
- if ( result == PAGE_SIZE) return 0;
- return result;
+ struct inode *inode = dentry->d_inode;
+ unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT;
+ unsigned offset = PAGE_CACHE_SIZE;
+ int err;
+
+ /* easy case */
+ if (page->index < end_index)
+ goto do_it;
+ /* things got complicated... */
+ offset = inode->i_size & (PAGE_CACHE_SIZE-1);
+ /* OK, are we completely out? */
+ if (page->index >= end_index+1 || !offset)
+ return -EIO;
+do_it:
+ err = nfs_writepage_sync(dentry, inode, page, 0, offset);
+ if ( err == offset) return 0;
+ return err;
}
/*