Mercurial > yaffs-ecoscentric-gpl
diff yaffs_fs.c @ 67:cb8afec5ad31
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 <luc> |
|---|---|
| date | Thu, 04 Aug 2005 22:47:36 +0000 |
| parents | 49f66fca0b09 |
| children | ddb4fe818ca3 |
line wrap: on
line diff
--- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -30,7 +30,7 @@ */ -const char *yaffs_fs_c_version = "$Id: yaffs_fs.c,v 1.26 2005-08-01 21:02:22 luc Exp $"; +const char *yaffs_fs_c_version = "$Id: yaffs_fs.c,v 1.27 2005-08-04 22:47:36 luc Exp $"; extern const char *yaffs_guts_c_version; @@ -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);
