X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.c;h=e949e319aa2fb1a5b60dad1ae117839c8b10fa93;hp=6c109c7374279abf1471bb16042d144e9162597b;hb=9d6c9cd652fe4778e22349615e0ce17afbc11bec;hpb=39673b8bf552cda30a07c4886c5cdc0f6a955216 diff --git a/yaffs_guts.c b/yaffs_guts.c index 6c109c7..e949e31 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -13,7 +13,7 @@ */ const char *yaffs_guts_c_version = - "$Id: yaffs_guts.c,v 1.25 2005-12-08 00:51:15 charles Exp $"; + "$Id: yaffs_guts.c,v 1.29 2006-02-08 22:29:14 charles Exp $"; #include "yportenv.h" @@ -335,6 +335,7 @@ static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device * dev, int blk) static Y_INLINE int yaffs_HashFunction(int n) { + n = abs(n); return (n % YAFFS_NOBJECT_BUCKETS); } @@ -2346,6 +2347,7 @@ static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block) ("yaffs: About to finally delete object %d" TENDSTR), object->objectId)); yaffs_DoGenericObjectDeletion(object); + object->myDev->nDeletedFiles--; } } @@ -4437,7 +4439,7 @@ static int yaffs_ScanBackwards(yaffs_Device * dev) yaffs_Object *in; yaffs_Object *parent; int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; - + int itsUnlinked; __u8 *chunkData; yaffs_BlockIndex *blockIndex = NULL; @@ -4847,11 +4849,8 @@ static int yaffs_ScanBackwards(yaffs_Device * dev) yaffs_AddObjectToDirectory(parent, in); - if ((parent == dev->deletedDir || - parent == dev->unlinkedDir)) { - /* If it is unlinked at start up then it wants deleting */ - in->deleted = 1; - } + itsUnlinked = (parent == dev->deletedDir) || + (parent == dev->unlinkedDir); if (oh->isShrink) { /* Mark the block as having a shrinkHeader */ @@ -4894,11 +4893,13 @@ static int yaffs_ScanBackwards(yaffs_Device * dev) break; case YAFFS_OBJECT_TYPE_HARDLINK: - in->variant.hardLinkVariant.equivalentObjectId = + if(!itsUnlinked) { + in->variant.hardLinkVariant.equivalentObjectId = oh->equivalentObjectId; - in->hardLinks.next = + in->hardLinks.next = (struct list_head *) hardList; - hardList = in; + hardList = in; + } break; case YAFFS_OBJECT_TYPE_DIRECTORY: /* Do nothing */ @@ -5691,6 +5692,8 @@ int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev) nFree = yaffs_CountFreeChunks(dev); #endif + nFree += dev->nDeletedFiles; + /* Now count the number of dirty chunks in the cache and subtract those */ {