X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.c;h=d77ee4745d79e29d1e18ceeafc57a2b591c38a66;hp=42e234a73f56852b4d5760733c3f9ec59e3ae076;hb=0e574e5047f4376cc2fa22962c7f2df012a089a9;hpb=36dc48ebac4140345b3f5955d5013f6c22ad827a diff --git a/yaffs_guts.c b/yaffs_guts.c index 42e234a..d77ee47 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002-2007 Aleph One Ltd. + * Copyright (C) 2002-2010 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -10,10 +10,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ - -const char *yaffs_guts_c_version = - "$Id: yaffs_guts.c,v 1.120 2010-03-15 23:10:34 charles Exp $"; - #include "yportenv.h" #include "yaffs_trace.h" @@ -3465,11 +3461,18 @@ static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev, selected = dev->gcDirtiest; } - if(!selected && dev->param.isYaffs2 && dev->gcNotDone >= ( background ? 10 : 20)){ + /* + * If nothing has been selected for a while, try selecting the oldest dirty + * because that's gumming up the works. + */ + + if(!selected && dev->param.isYaffs2 && + dev->gcNotDone >= ( background ? 10 : 20)){ yaffs_FindOldestDirtySequence(dev); if(dev->oldestDirtyBlock > 0) { selected = dev->oldestDirtyBlock; dev->gcDirtiest = selected; + dev->oldestDirtyGCs++; bi = yaffs_GetBlockInfo(dev, selected); dev->gcPagesInUse = bi->pagesInUse - bi->softDeletions; } else @@ -3483,6 +3486,8 @@ static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev, dev->param.nChunksPerBlock - dev->gcPagesInUse, prioritised)); + if(background) + dev->backgroundGCs++; dev->gcDirtiest = 0; dev->gcPagesInUse = 0; dev->gcNotDone = 0; @@ -3575,9 +3580,9 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background) } if (dev->gcBlock > 0) { - dev->garbageCollections++; + dev->allGCs++; if (!aggressive) - dev->passiveGarbageCollections++; + dev->passiveGCs++; T(YAFFS_TRACE_GC, (TSTR @@ -3605,11 +3610,11 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background) * Garbage collects. Intended to be called from a background thread. * Returns non-zero if at least half the free chunks are erased. */ -int yaffs_BackgroundGarbageCollect(yaffs_Device *dev) +int yaffs_BackgroundGarbageCollect(yaffs_Device *dev, unsigned urgency) { int erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock; - T(YAFFS_TRACE_BACKGROUND, (TSTR("Background gc" TENDSTR))); + T(YAFFS_TRACE_BACKGROUND, (TSTR("Background gc %u" TENDSTR),urgency)); yaffs_CheckGarbageCollection(dev, 1); return erasedChunks > dev->nFreeChunks/2; @@ -6762,7 +6767,7 @@ static int yaffs_ScanBackwards(yaffs_Device *dev) * the current allocation block. */ - T(YAFFS_TRACE_ALWAYS, + T(YAFFS_TRACE_SCAN, (TSTR("Partially written block %d detected" TENDSTR), blk)); } @@ -7907,8 +7912,10 @@ int yaffs_GutsInitialise(yaffs_Device *dev) /* OK, we've finished verifying the device, lets continue with initialisation */ /* More device initialisation */ - dev->garbageCollections = 0; - dev->passiveGarbageCollections = 0; + dev->allGCs = 0; + dev->passiveGCs = 0; + dev->oldestDirtyGCs = 0; + dev->backgroundGCs = 0; dev->gcBlockFinder = 0; dev->bufferedBlock = -1; dev->doingBufferedBlockRewrite = 0;