X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_fs.c;h=57a8c108b7eba87b3776d526076dd634a0523b92;hp=30ac2651a3602df49634571e13a0f49568f71dec;hb=6f1de4473200f31d1ca1cf4672baf7afcdec2db0;hpb=3321ac060648a65e47093e6f3e7387b4b1c5d5cd diff --git a/yaffs_fs.c b/yaffs_fs.c index 30ac265..57a8c10 100644 --- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -1,15 +1,25 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * yaffs_fs.c + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning + * Acknowledgements: + * Luc van OostenRyck for numerous patches. + * Nick Bane for numerous patches. + * Nick Bane for 2.5/2.6 integration. + * Andras Toth for mknod rdev issue. + * Michael Fischer for finding the problem with inode inconsistency. + * Some code bodily lifted from JFFS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. + * + */ + +/* * * This is the file system front-end to YAFFS that hooks it up to * the VFS. @@ -20,24 +30,18 @@ * >> 2.6: sb->s_fs_info points to the yaffs_Device associated with this * superblock * >> inode->u.generic_ip points to the associated yaffs_Object. - * - * Acknowledgements: - * * Luc van OostenRyck for numerous patches. - * * Nick Bane for numerous patches. - * * Nick Bane for 2.5/2.6 integration. - * * Andras Toth for mknod rdev issue. - * * Michael Fischer for finding the problem with inode inconsistency. - * * Some code bodily lifted from JFFS2. */ const char *yaffs_fs_c_version = - "$Id: yaffs_fs.c,v 1.52 2006-09-26 13:28:13 vwool Exp $"; + "$Id: yaffs_fs.c,v 1.57 2007-02-12 16:55:25 wookey Exp $"; extern const char *yaffs_guts_c_version; +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include +#endif #include #include -#include #include #include #include @@ -89,7 +93,13 @@ unsigned yaffs_traceMask = YAFFS_TRACE_ALWAYS | /*#define T(x) printk x */ -#define yaffs_InodeToObject(iptr) ((yaffs_Object *)((iptr)->u.generic_ip)) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) +#define yaffs_InodeToObjectLV(iptr) (iptr)->i_private +#else +#define yaffs_InodeToObjectLV(iptr) (iptr)->u.generic_ip +#endif + +#define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr))) #define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode) #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) @@ -189,8 +199,15 @@ static struct address_space_operations yaffs_file_address_operations = { }; static struct file_operations yaffs_file_operations = { +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) + .read = do_sync_read, + .write = do_sync_write, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, +#else .read = generic_file_read, .write = generic_file_write, +#endif .mmap = generic_file_mmap, .flush = yaffs_file_flush, .fsync = yaffs_sync_object, @@ -408,7 +425,7 @@ static void yaffs_clear_inode(struct inode *inode) * the yaffs_Object. */ obj->myInode = NULL; - inode->u.generic_ip = NULL; + yaffs_InodeToObjectLV(inode) = NULL; /* If the object freeing was deferred, then the real * free happens now. @@ -704,7 +721,9 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj) inode->i_mode = obj->yst_mode; inode->i_uid = obj->yst_uid; inode->i_gid = obj->yst_gid; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) inode->i_blksize = inode->i_sb->s_blocksize; +#endif #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) inode->i_rdev = old_decode_dev(obj->yst_rdev); @@ -756,7 +775,8 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj) break; } - inode->u.generic_ip = obj; + yaffs_InodeToObjectLV(inode) = obj; + obj->myInode = inode; } else { @@ -1294,23 +1314,23 @@ static int yaffs_statfs(struct super_block *sb, struct statfs *buf) buf->f_type = YAFFS_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_namelen = 255; - if (sb->s_blocksize > dev->nBytesPerChunk) { + if (sb->s_blocksize > dev->nDataBytesPerChunk) { buf->f_blocks = (dev->endBlock - dev->startBlock + 1) * dev->nChunksPerBlock / (sb->s_blocksize / - dev->nBytesPerChunk); + dev->nDataBytesPerChunk); buf->f_bfree = yaffs_GetNumberOfFreeChunks(dev) / (sb->s_blocksize / - dev->nBytesPerChunk); + dev->nDataBytesPerChunk); } else { buf->f_blocks = (dev->endBlock - dev->startBlock + - 1) * dev->nChunksPerBlock * (dev->nBytesPerChunk / + 1) * dev->nChunksPerBlock * (dev->nDataBytesPerChunk / sb->s_blocksize); buf->f_bfree = - yaffs_GetNumberOfFreeChunks(dev) * (dev->nBytesPerChunk / + yaffs_GetNumberOfFreeChunks(dev) * (dev->nDataBytesPerChunk / sb->s_blocksize); } buf->f_files = 0; @@ -1322,7 +1342,7 @@ static int yaffs_statfs(struct super_block *sb, struct statfs *buf) } - +/** static int yaffs_do_sync_fs(struct super_block *sb) { @@ -1341,7 +1361,7 @@ static int yaffs_do_sync_fs(struct super_block *sb) } return 0; } - +**/ #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) static void yaffs_write_super(struct super_block *sb) @@ -1543,7 +1563,7 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) mtd->writesize == 512) { #else - mtd->oobblock >= 512) { + mtd->oobblock == 512) { #endif T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs1\n")); yaffsVersion = 1; @@ -1639,7 +1659,7 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, dev->startBlock = 0; dev->endBlock = nBlocks - 1; dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK; - dev->nBytesPerChunk = YAFFS_BYTES_PER_CHUNK; + dev->nDataBytesPerChunk = YAFFS_BYTES_PER_CHUNK; dev->nReservedBlocks = 5; dev->nShortOpCaches = 10; /* Enable short op caching */ @@ -1654,15 +1674,15 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, dev->spareBuffer = YMALLOC(mtd->oobsize); dev->isYaffs2 = 1; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) - dev->nBytesPerChunk = mtd->writesize; + dev->nDataBytesPerChunk = mtd->writesize; dev->nChunksPerBlock = mtd->erasesize / mtd->writesize; #else - dev->nBytesPerChunk = mtd->oobblock; + dev->nDataBytesPerChunk = mtd->oobblock; dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock; #endif nBlocks = mtd->size / mtd->erasesize; - dev->nCheckpointReservedBlocks = 10; + dev->nCheckpointReservedBlocks = CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS; dev->startBlock = 0; dev->endBlock = nBlocks - 1; } else { @@ -1947,7 +1967,7 @@ static int yaffs_proc_write(struct file *file, const char *buf, char *end, *mask_name; int i; int done = 0; - int add, len; + int add, len = 0; int pos = 0; rg = yaffs_traceMask; @@ -2009,7 +2029,8 @@ static int yaffs_proc_write(struct file *file, const char *buf, } } - yaffs_traceMask = rg; + yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS; + if (rg & YAFFS_TRACE_ALWAYS) { for (i = 0; mask_flags[i].mask_name != NULL; i++) { char flag;