From: luc Date: Thu, 4 Aug 2005 22:47:36 +0000 (+0000) Subject: Fix an error in writepage when a file is extended. X-Git-Tag: pre-name-change~420 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=c85c5fe1c37f7fac343557a94f7d6726f9b7403c 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. --- diff --git a/yaffs_fs.c b/yaffs_fs.c index 4ae8a6e..35d0f41 100644 --- 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 *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 *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 *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);