X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fnodecache.c;h=b2cc57faddb6ae55389d1cffbb92590796c674f1;hb=097d17ad093701091b0925aa7b13378cb9aed9df;hp=ffad243770a8100f808d72870bd1ccc9097233b1;hpb=dfa46953df4e4c3717fb0fb216b144a787dcde59;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/nodecache.c b/KernelLand/Kernel/vfs/nodecache.c index ffad2437..b2cc57fa 100644 --- a/KernelLand/Kernel/vfs/nodecache.c +++ b/KernelLand/Kernel/vfs/nodecache.c @@ -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;