X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_fs.c;h=8034a066edd39f72414692656d60355cd360bdf6;hp=a62724fe16e5d8c81b19917dfce6c6ce2b1491d3;hb=380068d8dfd26d7975fb356f9f5439282d17b4d6;hpb=1ecaab628c922b75b3fa6cdb9fd73bfe619fe1c8 diff --git a/yaffs_fs.c b/yaffs_fs.c index a62724f..8034a06 100644 --- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -32,7 +32,7 @@ */ const char *yaffs_fs_c_version = - "$Id: yaffs_fs.c,v 1.90 2009-12-23 03:14:17 charles Exp $"; + "$Id: yaffs_fs.c,v 1.93 2010-02-10 03:54:08 charles Exp $"; extern const char *yaffs_guts_c_version; #include @@ -114,6 +114,7 @@ static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size) #include #include "yportenv.h" +#include "yaffs_trace.h" #include "yaffs_guts.h" #include @@ -323,6 +324,17 @@ static const struct file_operations yaffs_file_operations = { }; #endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)) +static void zero_user_segment(struct page *page, unsigned start, unsigned end) +{ + void * kaddr = kmap_atomic(page, KM_USER0); + memset(kaddr + start, 0, end - start); + kunmap_atomic(kaddr, KM_USER0); + flush_dcache_page(page); +} +#endif + + static const struct inode_operations yaffs_file_inode_operations = { .setattr = yaffs_setattr, }; @@ -1585,7 +1597,7 @@ static int yaffs_sync_object(struct file *file, struct dentry *dentry, dev = obj->myDev; - T(YAFFS_TRACE_OS, ("yaffs_sync_object\n")); + T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, ("yaffs_sync_object\n")); yaffs_GrossLock(dev); yaffs_FlushFile(obj, 1, datasync); yaffs_GrossUnlock(dev); @@ -1650,14 +1662,20 @@ static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry, static int yaffs_setattr(struct dentry *dentry, struct iattr *attr) { struct inode *inode = dentry->d_inode; - int error; + int error = 0; yaffs_Device *dev; T(YAFFS_TRACE_OS, ("yaffs_setattr of object %d\n", yaffs_InodeToObject(inode)->objectId)); - error = inode_change_ok(inode, attr); + /* Fail if a requested resize >= 2GB */ + if (attr->ia_valid & ATTR_SIZE && + (attr->ia_size >> 31)) + error = -EINVAL; + + if (error == 0) + error = inode_change_ok(inode, attr); if (error == 0) { int result; if (!error){ @@ -1680,8 +1698,9 @@ static int yaffs_setattr(struct dentry *dentry, struct iattr *attr) yaffs_GrossUnlock(dev); } + T(YAFFS_TRACE_OS, - ("yaffs_setattr done\n")); + ("yaffs_setattr done returning %d\n",error)); return error; } @@ -1776,7 +1795,7 @@ static int yaffs_do_sync_fs(struct super_block *sb) { yaffs_Device *dev = yaffs_SuperToDevice(sb); - T(YAFFS_TRACE_OS, ("yaffs_do_sync_fs\n")); + T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, ("yaffs_do_sync_fs\n")); if (sb->s_dirt) { yaffs_GrossLock(dev); @@ -1802,7 +1821,7 @@ static int yaffs_write_super(struct super_block *sb) #endif { - T(YAFFS_TRACE_OS, ("yaffs_write_super\n")); + T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, ("yaffs_write_super\n")); if (yaffs_auto_checkpoint >= 2) yaffs_do_sync_fs(sb); #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) @@ -1817,7 +1836,7 @@ static int yaffs_sync_fs(struct super_block *sb, int wait) static int yaffs_sync_fs(struct super_block *sb) #endif { - T(YAFFS_TRACE_OS, ("yaffs_sync_fs\n")); + T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, ("yaffs_sync_fs\n")); if (yaffs_auto_checkpoint >= 1) yaffs_do_sync_fs(sb); @@ -2593,6 +2612,7 @@ static struct { {"scan_debug", YAFFS_TRACE_SCAN_DEBUG}, {"scan", YAFFS_TRACE_SCAN}, {"tracing", YAFFS_TRACE_TRACING}, + {"sync", YAFFS_TRACE_SYNC}, {"verify", YAFFS_TRACE_VERIFY}, {"verify_nand", YAFFS_TRACE_VERIFY_NAND},