/*
* 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 <charles@aleph1.co.uk>
* 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"
int maxThreshold = dev->param.nChunksPerBlock/2;
threshold = background ?
(dev->gcNotDone + 2) * 2 : 0;
- threshold = max(threshold, YAFFS_GC_PASSIVE_THRESHOLD);
- threshold = min(threshold, maxThreshold);
+ if(threshold <YAFFS_GC_PASSIVE_THRESHOLD)
+ threshold = YAFFS_GC_PASSIVE_THRESHOLD;
+ if(threshold > maxThreshold)
+ threshold = maxThreshold;
iterations = nBlocks / 16 + 1;
if (iterations > 100)
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
dev->param.nChunksPerBlock - dev->gcPagesInUse,
prioritised));
+ if(background)
+ dev->backgroundGCs++;
dev->gcDirtiest = 0;
dev->gcPagesInUse = 0;
dev->gcNotDone = 0;
}
if (dev->gcBlock > 0) {
- dev->garbageCollections++;
+ dev->allGCs++;
if (!aggressive)
- dev->passiveGarbageCollections++;
+ dev->passiveGCs++;
T(YAFFS_TRACE_GC,
(TSTR
* 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;
* the current allocation block.
*/
- T(YAFFS_TRACE_ALWAYS,
+ T(YAFFS_TRACE_SCAN,
(TSTR("Partially written block %d detected" TENDSTR),
blk));
}
/* 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;