Don't mark objects deleted during scanning
[yaffs2.git] / yaffs_guts.c
index b17262beee992cfedb11d4b7031791188fe248ef..7d9fd4122669909035080897c9dcb2bc2df35e9f 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 const char *yaffs_guts_c_version =
  */
 
 const char *yaffs_guts_c_version =
-    "$Id: yaffs_guts.c,v 1.24 2005-12-07 21:49:18 charles Exp $";
+    "$Id: yaffs_guts.c,v 1.27 2005-12-20 04:02:18 charles Exp $";
 
 #include "yportenv.h"
 
 
 #include "yportenv.h"
 
@@ -541,7 +541,7 @@ static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
        int tnodeSize;
        yaffs_Tnode *newTnodes;
        __u8 *mem;
        int tnodeSize;
        yaffs_Tnode *newTnodes;
        __u8 *mem;
-       yaffs_Tnode *current;
+       yaffs_Tnode *curr;
        yaffs_Tnode *next;
        yaffs_TnodeList *tnl;
 
        yaffs_Tnode *next;
        yaffs_TnodeList *tnl;
 
@@ -554,7 +554,8 @@ static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
 
        /* make these things */
 
 
        /* make these things */
 
-       mem = newTnodes = YMALLOC(nTnodes * tnodeSize);
+       newTnodes = YMALLOC(nTnodes * tnodeSize);
+       mem = (__u8 *)newTnodes;
 
        if (!newTnodes) {
                T(YAFFS_TRACE_ERROR,
 
        if (!newTnodes) {
                T(YAFFS_TRACE_ERROR,
@@ -579,13 +580,13 @@ static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
 #else
        /* New hookup for wide tnodes */
        for(i = 0; i < nTnodes -1; i++) {
 #else
        /* New hookup for wide tnodes */
        for(i = 0; i < nTnodes -1; i++) {
-               current = (yaffs_Tnode *) &mem[i * tnodeSize];
+               curr = (yaffs_Tnode *) &mem[i * tnodeSize];
                next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize];
                next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize];
-               current->internal[0] = next;
+               curr->internal[0] = next;
        }
        
        }
        
-       current = (yaffs_Tnode *) &mem[(nTnodes - 1) * tnodeSize];
-       current->internal[0] = dev->freeTnodes;
+       curr = (yaffs_Tnode *) &mem[(nTnodes - 1) * tnodeSize];
+       curr->internal[0] = dev->freeTnodes;
        dev->freeTnodes = (yaffs_Tnode *)mem;
 
 #endif
        dev->freeTnodes = (yaffs_Tnode *)mem;
 
 #endif
@@ -4436,7 +4437,7 @@ static int yaffs_ScanBackwards(yaffs_Device * dev)
        yaffs_Object *in;
        yaffs_Object *parent;
        int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
        yaffs_Object *in;
        yaffs_Object *parent;
        int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
+       int itsUnlinked;
        __u8 *chunkData;
 
        yaffs_BlockIndex *blockIndex = NULL;
        __u8 *chunkData;
 
        yaffs_BlockIndex *blockIndex = NULL;
@@ -4846,11 +4847,8 @@ static int yaffs_ScanBackwards(yaffs_Device * dev)
 
                                        yaffs_AddObjectToDirectory(parent, in);
 
 
                                        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 */
 
                                        if (oh->isShrink) {
                                                /* Mark the block as having a shrinkHeader */
@@ -4893,11 +4891,13 @@ static int yaffs_ScanBackwards(yaffs_Device * dev)
 
                                                break;
                                        case YAFFS_OBJECT_TYPE_HARDLINK:
 
                                                break;
                                        case YAFFS_OBJECT_TYPE_HARDLINK:
-                                               in->variant.hardLinkVariant.equivalentObjectId =
+                                               if(!itsUnlinked) {
+                                                 in->variant.hardLinkVariant.equivalentObjectId =
                                                    oh->equivalentObjectId;
                                                    oh->equivalentObjectId;
-                                               in->hardLinks.next =
+                                                 in->hardLinks.next =
                                                    (struct list_head *) hardList;
                                                    (struct list_head *) hardList;
-                                               hardList = in;
+                                                 hardList = in;
+                                               }
                                                break;
                                        case YAFFS_OBJECT_TYPE_DIRECTORY:
                                                /* Do nothing */
                                                break;
                                        case YAFFS_OBJECT_TYPE_DIRECTORY:
                                                /* Do nothing */