Mercurial > yaffs-ecoscentric
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);
