There're many unnecessary reads for inband mode in yaffs_WriteDataToFile.
if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
/* An incomplete start or end chunk (or maybe both start and end chunk),
* or we're using inband tags, so we want to use the cache buffers.
*/
if (dev->nShortOpCaches > 0) {
yaffs_ChunkCache *cache;
/* If we can't find the data in the cache, then load the cache */
cache = yaffs_FindChunkCache(in, chunk);
if (!cache
&& yaffs_CheckSpaceForAllocation(in->
myDev)) {
cache = yaffs_GrabChunkCache(in->myDev);
cache->object = in;
cache->chunkId = chunk;
cache->dirty = 0;
cache->locked = 0;
+ if (chunk<=in->nDataChunks)
yaffs_ReadChunkDataFromObject(in, chunk,
cache->
data);
} else if (cache &&
!cache->dirty &&
!yaffs_CheckSpaceForAllocation(in->myDev)) {
/* Drop the cache if it was a read cache item and
* no space check has been made for it.
*/
cache = NULL;
}
On Mon, Sep 14, 2009 at 3:41 PM, zheng shi <
neversetsun@gmail.com> wrote:
> 1. When written bytes are appended to the end of file,
> there's no need to read the correspoding chunks.
> The overhead is unnecessary and was especially
> large before yaffs_guts.c version 1.89.
>
> 2. In yaffs_ReadChunkDataFromObject, the condition
> should be changed:
>
> static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode,
> __u8 *buffer)
> {
> int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL);
>
> - if (chunkInNAND >= 0)
> + if (chunkInNAND > 0)
> return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND,
> buffer, NULL);
> else {
> T(YAFFS_TRACE_NANDACCESS,
> (TSTR("Chunk %d not found zero instead" TENDSTR),
> chunkInNAND));
> /* get sane (zero) data if you read a hole */
> memset(buffer, 0, in->myDev->nDataBytesPerChunk);
> return 0;
> }
>
> --
> Regards, Shizheng
>
--
Regards, Shizheng