Fixes for 2.6 special inodes
[yaffs/.git] / yaffs_guts.c
index 7c97b314bfd1d2be9d5ce70e42e0324099edc728..e4a61c09d5d19b7332b17bbfa7ebe4580f520556 100644 (file)
@@ -14,7 +14,7 @@
  */
  //yaffs_guts.c
 
-const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.37 2004-10-20 20:12:43 charles Exp $";
+const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.41 2005-04-24 08:54:36 charles Exp $";
 
 #include "yportenv.h"
 
@@ -1623,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;
                        }
                }
@@ -1823,7 +1828,7 @@ yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent,const char *name, __u32
 
 yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent,const char *name, __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
 {
-       return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY,parent,name,mode,uid,gid,NULL,NULL,rdev);
+       return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL,parent,name,mode,uid,gid,NULL,NULL,rdev);
 }
 
 yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent,const char *name, __u32 mode, __u32 uid, __u32 gid,const char *alias)
@@ -3136,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;
        
@@ -3765,6 +3770,7 @@ 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)
@@ -3969,6 +3975,9 @@ static int yaffs_UnlinkWorker(yaffs_Object *obj)
                        case YAFFS_OBJECT_TYPE_SYMLINK:
                                return yaffs_DeleteSymLink(obj);
                                break;
+                       case YAFFS_OBJECT_TYPE_SPECIAL:
+                               return yaffs_DoGenericObjectDeletion(obj);
+                               break;
                        case YAFFS_OBJECT_TYPE_HARDLINK:
                        case YAFFS_OBJECT_TYPE_UNKNOWN:
                        default:
@@ -4783,6 +4792,7 @@ int yaffs_GutsInitialise(yaffs_Device *dev)
        dev->eccUnfixed=0;
        dev->tagsEccFixed=0;
        dev->tagsEccUnfixed=0;
+       dev->nErasedBlocks=0;
        
        dev->localBuffer = YMALLOC(dev->nBytesPerChunk);
        
@@ -4855,6 +4865,7 @@ void yaffs_Deinitialise(yaffs_Device *dev)
                if(dev->nShortOpCaches > 0)
                        YFREE(dev->srCache);
                YFREE(dev->localBuffer);
+               dev->isMounted = 0;
        }
        
 }
@@ -5010,3 +5021,4 @@ void yaffs_GutsTest(yaffs_Device *dev)
 
 
 
+