[Yaffs] Unexpected erase behavior when rewriting a file on a nearly
empty YAFFS
Peter Barada
Peter.B at LogicPD.com
Fri Nov 4 17:23:07 GMT 2005
I've got YAFFS working on a NOR-based system, and I'm doing some testing
on it. If I start with an erased YAFFS, mount it on /mnt/yaffs, and
then:
# cp /bin/bash /mnt/yaffs
# cp /bin/bash /mnt/yaffs
I see that calls are made to erase the block(s). I'm wondering why? I
thought that when chunks are overwritten, that they are marked as
available for recycling and leave it to the garbage collector to do it.
The callback from yaffs_EraseBlockInNand looks like:
(gdb) where 5
#0 yaffs_EraseBlockInNAND (dev=0xc06a7000, blockInNAND=13)
at yaffs_guts.c:352
#1 0xc010ee16 in yaffs_BlockBecameDirty (dev=0xc06a7000, blockNo=13)
at yaffs_guts.c:2118
#2 0xc010fa56 in yaffs_DeleteChunk (dev=0xc06a7000, chunkId=0,
markNAND=1)
at yaffs_guts.c:2935
#3 0xc01103e4 in yaffs_ResizeFile (in=0xc037c132, newSize=0)
at yaffs_guts.c:3695
#4 0xc0111374 in yaffs_SetAttributes (obj=0xc037c132, attr=0xc06a7000)
at yaffs_guts.c:4627
(More stack frames follow...)
I think the issue is the test:
if(bi->pagesInUse == 0 &&
bi->blockState == YAFFS_BLOCK_STATE_FULL)
{
yaffs_BlockBecameDirty(dev,block);
}
in yaffs_DeleteChunk. I *think*(but amd not sure) that if this test is
disabled, the block with all its chunks marked dirty will be left alone
until *all* the chunks are written and a garbage collection is forced.
I also think this will spread out writes even more in the filesystem.
Thoughts?
--
Peter Barada <Peter.B at LogicPD.com>
More information about the yaffs
mailing list