X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fnodecache.c;h=0d238941be80a52f40903417982dc6f1b83182ee;hb=8dcc3e209d0d728565a18c8dca2b0ba220b74a6f;hp=d2796c1b9d3420d5edb737d739bcee72867a0f63;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/nodecache.c b/KernelLand/Kernel/vfs/nodecache.c index d2796c1b..0d238941 100644 --- a/KernelLand/Kernel/vfs/nodecache.c +++ b/KernelLand/Kernel/vfs/nodecache.c @@ -1,7 +1,11 @@ /* - * AcessMicro VFS - * - File IO Passthru's + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * + * vfs/nodecache.c + * - VFS Node Caching facility */ +#define DEBUG 0 #include #include "vfs.h" #include "vfs_int.h" @@ -45,7 +49,7 @@ int Inode_GetHandle() gVFS_InodeCache = ent; SHORTREL( &glVFS_InodeCache ); - return gVFS_NextInodeHandle-1; + return ent->Handle; } /** @@ -107,7 +111,10 @@ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) newEnt->Next = ent; memcpy(&newEnt->Node, Node, sizeof(tVFS_Node)); prev->Next = newEnt; - + newEnt->Node.ReferenceCount = 1; + + LOG("Cached %llx as %p", Node->Inode, &newEnt->Node); + return &newEnt->Node; } @@ -115,42 +122,72 @@ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) * \fn void Inode_UncacheNode(int Handle, Uint64 Inode) * \brief Dereferences/Removes a cached node */ -void Inode_UncacheNode(int Handle, Uint64 Inode) +int Inode_UncacheNode(int Handle, Uint64 Inode) { tInodeCache *cache; tCachedInode *ent, *prev; cache = Inode_int_GetFSCache(Handle); - if(!cache) return ; - - if(Inode > cache->MaxCached) return ; + if(!cache) { + Log_Notice("Inode", "Invalid cache handle %i used", Handle); + return -1; + } + + ENTER("iHandle XInode", Handle, Inode); + + if(Inode > cache->MaxCached) { + LEAVE('i', -1); + return -1; + } // 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; - if(ent->Node.Inode > Inode) return; - ent->Node.ReferenceCount --; - // Check if node needs to be freed - if(ent->Node.ReferenceCount == 0) - { + if(ent->Node.Inode > Inode) { + LEAVE('i', -1); + return -1; + } + break; + } + + LOG("ent = %p", ent); + + if( !ent ) { + LEAVE('i', -1); + return -1; + } + + ent->Node.ReferenceCount --; + // Check if node needs to be freed + if(ent->Node.ReferenceCount == 0) + { + if( prev ) prev->Next = ent->Next; - if(ent->Node.Inode == cache->MaxCached) - { - if(ent != cache->FirstNode) - cache->MaxCached = prev->Node.Inode; - else - cache->MaxCached = 0; - } - - free(ent); + else + cache->FirstNode = ent->Next; + if(ent->Node.Inode == cache->MaxCached) + { + if(ent != cache->FirstNode && prev) + cache->MaxCached = prev->Node.Inode; + else + cache->MaxCached = 0; } - return ; + + if(ent->Node.Data) + free(ent->Node.Data); + free(ent); + LOG("Freed"); + LEAVE('i', 1); + return 1; + } + else + { + LEAVE('i', 0); + return 0; } - - return ; } /**