changeset 69:ea3ee1ec917a

Fix an error in writepage when a file is extended. When a file is extended with truncate(), the call to inode_setattr() in yaffs_setattr() call vmtruncate() which itself call a bunches of yaffs_writepage(). There we must NOT fill page whit index greater that the one given by the inode 'cos these pages refers to parts of the file which doesn't physically exists.
author luc
date Thu, 04 Aug 2005 23:47:36 +0100
parents ee0e4ad4020d
children 5108c854efb3
files yaffs_fs.c
diffstat 1 files changed, 13 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/yaffs_fs.c
+++ b/yaffs_fs.c
@@ -488,6 +488,7 @@ static int yaffs_writepage(struct page *
 #endif
 {
 	struct address_space *mapping = page->mapping;
+	loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
 	struct inode *inode;
 	unsigned long end_index;
 	char *buffer;
@@ -501,6 +502,14 @@ static int yaffs_writepage(struct page *
 	if (!inode)
 		BUG();
 
+	if (offset > inode->i_size)
+	{
+		T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_writepage at %08x, inode size = %08x!!!\n", (unsigned)(page->index << PAGE_CACHE_SHIFT), (unsigned) inode->i_size));
+		T(YAFFS_TRACE_OS,(KERN_DEBUG"                -> don't care!!\n"));
+		unlock_page(page);
+		return 0;
+	}
+
 	end_index = inode->i_size >> PAGE_CACHE_SHIFT;
 
 	/* easy case */
@@ -525,9 +534,13 @@ static int yaffs_writepage(struct page *
 	obj = yaffs_InodeToObject(inode);
 	yaffs_GrossLock(obj->myDev);
 
+	T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_writepage at %08x, size %08x\n", (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
+	T(YAFFS_TRACE_OS,(KERN_DEBUG"writepag0: obj = %05x, ino = %05x\n", (int) obj->variant.fileVariant.fileSize, (int) inode->i_size));
 
 	nWritten = yaffs_WriteDataToFile(obj,buffer,page->index << PAGE_CACHE_SHIFT,nBytes,0);
 
+	T(YAFFS_TRACE_OS,(KERN_DEBUG"writepag1: obj = %05x, ino = %05x\n", (int) obj->variant.fileVariant.fileSize, (int) inode->i_size));
+
 	yaffs_GrossUnlock(obj->myDev);
 	
 	kunmap(page);