Fix unmounting flag
[yaffs/.git] / yaffs_guts.c
index 4757ff6802ceed1571b8fad2c556522010a454b7..0ace425f92f3d055bf5ad7ced90354057f344676 100644 (file)
@@ -14,7 +14,7 @@
  */
  //yaffs_guts.c
 
-const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.35 2004-09-21 03:03:12 charles Exp $";
+const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.39 2005-01-24 22:26:45 charles Exp $";
 
 #include "yportenv.h"
 
@@ -1444,6 +1444,16 @@ static void yaffs_FreeObject(yaffs_Object *tn)
 
        yaffs_Device *dev = tn->myDev;
        
+#ifdef  __KERNEL__
+       if(tn->myInode)
+       {
+               // We're still hooked up to a cached inode.
+               // Don't delete now, but mark for later deletion
+               tn->deferedFree = 1;
+               return;
+       }
+#endif
+       
        yaffs_UnhashObject(tn);
        
        // Link into the free list.
@@ -1453,6 +1463,18 @@ static void yaffs_FreeObject(yaffs_Object *tn)
 }
 
 
+#ifdef __KERNEL__
+
+void yaffs_HandleDeferedFree(yaffs_Object *obj)
+{
+       if(obj->deferedFree)
+       {
+          yaffs_FreeObject(obj);
+       }
+}
+
+#endif
+
 
 
 static void yaffs_DeinitialiseObjects(yaffs_Device *dev)
@@ -1601,6 +1623,11 @@ yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev,__u32 number)
                        in = list_entry(i, yaffs_Object,hashLink);
                        if(in->objectId == number)
                        {
+#ifdef __KERNEL__
+                               // Don't tell the VFS about this if it has been marked for freeing
+                               if(in->deferedFree) 
+                                   return NULL;
+#endif
                                return in;
                        }
                }
@@ -1638,12 +1665,8 @@ yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev,int number,yaffs_ObjectTyp
 
 #else
 
-//#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;             
-#endif
+               theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = Y_CURRENT_TIME;
+
 #endif
                switch(type)
                {
@@ -1747,12 +1770,8 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type,
                in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1];
                
 #else
-//#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;
-#endif
+
+               in->st_atime = in->st_mtime = in->st_ctime = Y_CURRENT_TIME;
                in->st_rdev  = rdev;
                in->st_uid   = uid;
                in->st_gid   = gid;
@@ -3122,7 +3141,7 @@ static void yaffs_FlushFilesChunkCache(yaffs_Object *obj)
        int lowest;
        int i;
        yaffs_ChunkCache *cache;
-       int chunkWritten;
+       int chunkWritten = 0;
        int nBytes;
        int nCaches = obj->myDev->nShortOpCaches;
        
@@ -3727,12 +3746,7 @@ 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(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-                       in->st_mtime = CURRENT_TIME.tv_sec;
-#else
-                       in->st_mtime = CURRENT_TIME;
-#endif
+                       in->st_mtime = Y_CURRENT_TIME;
 #endif
                }
 
@@ -3756,12 +3770,15 @@ static int yaffs_DoGenericObjectDeletion(yaffs_Object *in)
        
        yaffs_RemoveObjectFromDirectory(in);
        yaffs_DeleteChunk(in->myDev,in->chunkId,1);
+       in->chunkId = -1;
+#if 0
 #ifdef __KERNEL__
        if(in->myInode)
        {
                in->myInode->u.generic_ip = NULL;
-               in->myInode = 0;
+               in->myInode = NULL;
        }
+#endif
 #endif
        yaffs_FreeObject(in);
        return YAFFS_OK;
@@ -3799,6 +3816,8 @@ static int yaffs_UnlinkFile(yaffs_Object *in)
 #ifdef __KERNEL__
                if(!in->myInode)
                {
+                       // Might be open at present,
+                       // Caught by delete_inode in yaffs_fs.c
                        immediateDeletion = 1;
 
                }
@@ -4586,17 +4605,10 @@ 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(__KERNEL__) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+       if(valid & ATTR_ATIME) obj->st_atime = Y_TIME_CONVERT(attr->ia_atime);
+       if(valid & ATTR_CTIME) obj->st_ctime = Y_TIME_CONVERT(attr->ia_ctime);
+       if(valid & ATTR_MTIME) obj->st_mtime = Y_TIME_CONVERT(attr->ia_mtime);
 
-       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;
-#else
-       if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime;
-       if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime;
-       if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime;
-#endif
        
        if(valid & ATTR_SIZE) yaffs_ResizeFile(obj,attr->ia_size);
        
@@ -4605,6 +4617,7 @@ int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
        return YAFFS_OK;
        
 }
+
 int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
 {
        unsigned int valid = 0;
@@ -4613,16 +4626,11 @@ 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(__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;
-#else  
-       attr->ia_atime = obj->st_atime; valid |= ATTR_ATIME;
-       attr->ia_ctime = obj->st_ctime; valid |= ATTR_CTIME;
-       attr->ia_mtime = obj->st_mtime; valid |= ATTR_MTIME;
-#endif 
+       
+       Y_TIME_CONVERT(attr->ia_atime) = obj->st_atime; valid |= ATTR_ATIME;
+       Y_TIME_CONVERT(attr->ia_ctime) = obj->st_ctime; valid |= ATTR_CTIME;
+       Y_TIME_CONVERT(attr->ia_mtime) = obj->st_mtime; valid |= ATTR_MTIME;
+
        attr->ia_size = yaffs_GetFileSize(obj); valid |= ATTR_SIZE;
        
        attr->ia_valid = valid;
@@ -4853,6 +4861,7 @@ void yaffs_Deinitialise(yaffs_Device *dev)
                if(dev->nShortOpCaches > 0)
                        YFREE(dev->srCache);
                YFREE(dev->localBuffer);
+               dev->isMounted = 0;
        }
        
 }
@@ -5006,3 +5015,5 @@ void yaffs_GutsTest(yaffs_Device *dev)
 
 
 
+
+