*/
const char *yaffs_fs_c_version =
- "$Id: yaffs_fs.c,v 1.91 2010-01-11 04:06:46 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 <linux/version.h>
};
#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,
};
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){
yaffs_GrossUnlock(dev);
}
+
T(YAFFS_TRACE_OS,
- ("yaffs_setattr done\n"));
+ ("yaffs_setattr done returning %d\n",error));
return error;
}