*** empty log message ***
[yaffs/.git] / yaffs_guts.c
index 5218aeab3391faef20b9d85dbbf0800f29e0332f..4757ff6802ceed1571b8fad2c556522010a454b7 100644 (file)
@@ -14,7 +14,7 @@
  */
  //yaffs_guts.c
 
-const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.30 2003-09-16 06:48:38 charles Exp $";
+const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.35 2004-09-21 03:03:12 charles Exp $";
 
 #include "yportenv.h"
 
@@ -1085,7 +1085,7 @@ static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, in
                                                if(limit)
                                                { 
                                                        *limit = *limit-1;
-                                                       if(limit <= 0) 
+                                                       if(*limit <= 0) 
                                                        { 
                                                                hitLimit = 1;
                                                        }
@@ -1638,7 +1638,8 @@ yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev,int number,yaffs_ObjectTyp
 
 #else
 
-#if defined(CONFIG_KERNEL_2_5)
+//#if defined(CONFIG_KERNEL_2_5)
+#if defined(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
                theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = CURRENT_TIME.tv_sec;              
 #else
                theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = CURRENT_TIME;             
@@ -1743,10 +1744,11 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type,
 #ifdef CONFIG_YAFFS_WINCE
                yfsd_WinFileTimeNow(in->win_atime);
                in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0];
-               in->win_ctime[1] = in->win_mtime[1] = in->win_atime[0];
+               in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1];
                
 #else
-#if defined(CONFIG_KERNEL_2_5)
+//#if defined(CONFIG_KERNEL_2_5)
+#if defined(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
                in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME.tv_sec;
 #else
                in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME;
@@ -2302,6 +2304,7 @@ static int  yaffs_GarbageCollectBlock(yaffs_Device *dev,int block)
                                {
                                        // It's a header
                                        object->chunkId = newChunk;
+                                       object->serial = tags.serialNumber;
                                }
                                else
                                {
@@ -2843,6 +2846,7 @@ int yaffs_ReadChunkDataFromObject(yaffs_Object *in,int chunkInInode, __u8 *buffe
        }
        else
        {
+               memset(buffer,0,YAFFS_BYTES_PER_CHUNK);
                return 0;
        }
 
@@ -3668,8 +3672,10 @@ int yaffs_ResizeFile(yaffs_Object *in, int newSize)
                        int lastChunk = 1+ newSize/YAFFS_BYTES_PER_CHUNK;
                        
                        // Got to read and rewrite the last chunk with its new size.
+                       // NB Got to zero pad to nuke old data
                        yaffs_ReadChunkDataFromObject(in,lastChunk,dev->localBuffer);
-                       
+                       memset(dev->localBuffer + sizeOfPartialChunk,0, YAFFS_BYTES_PER_CHUNK - sizeOfPartialChunk);
+
                        yaffs_WriteChunkDataToObject(in,lastChunk,dev->localBuffer,sizeOfPartialChunk,1);
                                
                }
@@ -3721,7 +3727,8 @@ int yaffs_FlushFile(yaffs_Object *in, int updateTime)
 #ifdef CONFIG_YAFFS_WINCE
                        yfsd_WinFileTimeNow(in->win_mtime);
 #else
-#if defined(CONFIG_KERNEL_2_5)
+//#if defined(CONFIG_KERNEL_2_5)
+#if defined(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
                        in->st_mtime = CURRENT_TIME.tv_sec;
 #else
                        in->st_mtime = CURRENT_TIME;
@@ -4224,8 +4231,9 @@ static int yaffs_Scan(yaffs_Device *dev)
                                        {
                                                // Hoosterman, another problem....
                                                // We're trying to use a non-directory as a directory
-                                               // Todo ... handle
-                                               T(YAFFS_TRACE_ERROR, (TSTR("yaffs tragedy: attempting to use non-directory as a directory in scan" TENDSTR)));
+                                               
+                                               T(YAFFS_TRACE_ERROR, (TSTR("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." TENDSTR)));
+                                               parent = dev->lostNFoundDir;
 
                                        }
                                
@@ -4578,7 +4586,9 @@ int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
        if(valid & ATTR_UID) obj->st_uid = attr->ia_uid;
        if(valid & ATTR_GID) obj->st_gid = attr->ia_gid;
        
-#if defined(CONFIG_KERNEL_2_5)
+//#if defined(CONFIG_KERNEL_2_5)
+#if defined(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+
        if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime.tv_sec;
        if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime.tv_sec;
        if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime.tv_sec;
@@ -4603,7 +4613,8 @@ int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
        attr->ia_uid = obj->st_uid;             valid |= ATTR_UID;
        attr->ia_gid = obj->st_gid;             valid |= ATTR_GID;
        
-#if defined(CONFIG_KERNEL_2_5)
+//#if defined(CONFIG_KERNEL_2_5)
+#if defined(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
        attr->ia_atime.tv_sec = obj->st_atime;  valid |= ATTR_ATIME;
        attr->ia_ctime.tv_sec = obj->st_ctime;  valid |= ATTR_CTIME;
        attr->ia_mtime.tv_sec = obj->st_mtime;  valid |= ATTR_MTIME;
@@ -4839,6 +4850,8 @@ void yaffs_Deinitialise(yaffs_Device *dev)
                yaffs_DeinitialiseBlocks(dev);
                yaffs_DeinitialiseTnodes(dev);
                yaffs_DeinitialiseObjects(dev);
+               if(dev->nShortOpCaches > 0)
+                       YFREE(dev->srCache);
                YFREE(dev->localBuffer);
        }
        
@@ -4992,3 +5005,4 @@ void yaffs_GutsTest(yaffs_Device *dev)
 
 
 
+