Kernel/VFS - Fixed bug with setting flags on FD0
[tpg/acess2.git] / KernelLand / Kernel / vfs / nodecache.c
index ffad243..b2cc57f 100644 (file)
@@ -85,7 +85,7 @@ tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode)
 tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node)
 {
        tInodeCache     *cache;
-       tCachedInode    *newEnt, *ent, *prev;
+       tCachedInode    *newEnt, *ent, *prev = NULL;
        
        cache = Inode_int_GetFSCache(Handle);
        if(!cache)      return NULL;
@@ -95,7 +95,6 @@ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node)
        
        // Search Cache
        ent = cache->FirstNode;
-       prev = (tCachedInode*) &cache->FirstNode;
        for( ; ent; prev = ent, ent = ent->Next )
        {
                if(ent->Node.Inode < Node->Inode)       continue;
@@ -110,7 +109,10 @@ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node)
        newEnt = malloc(sizeof(tCachedInode));
        newEnt->Next = ent;
        memcpy(&newEnt->Node, Node, sizeof(tVFS_Node));
-       prev->Next = newEnt;
+       if( prev )
+               prev->Next = newEnt;
+       else
+               cache->FirstNode = newEnt;
        newEnt->Node.ReferenceCount = 1;
 
        LOG("Cached %llx as %p", Node->Inode, &newEnt->Node);
@@ -142,7 +144,7 @@ int Inode_UncacheNode(int Handle, Uint64 Inode)
        
        // Search Cache
        ent = cache->FirstNode;
-       prev = (tCachedInode*) &cache->FirstNode;       // Special case removal
+       prev = NULL;
        for( ; ent; prev = ent, ent = ent->Next )
        {
                if(ent->Node.Inode < Inode)     continue;
@@ -164,10 +166,13 @@ int Inode_UncacheNode(int Handle, Uint64 Inode)
        // Check if node needs to be freed
        if(ent->Node.ReferenceCount == 0)
        {
-               prev->Next = ent->Next;
+               if( prev )
+                       prev->Next = ent->Next;
+               else
+                       cache->FirstNode = ent->Next;
                if(ent->Node.Inode == cache->MaxCached)
                {
-                       if(ent != cache->FirstNode)
+                       if(ent != cache->FirstNode && prev)
                                cache->MaxCached = prev->Node.Inode;
                        else
                                cache->MaxCached = 0;

UCC git Repository :: git.ucc.asn.au