X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fnodecache.c;h=aee1826e006004bf0ce292d923f217ebb21b9fdf;hb=d31175a3542b5139e11b5835b1a50df0b06954fa;hp=0d238941be80a52f40903417982dc6f1b83182ee;hpb=3a8670fa06b6be062caead81737848fcb01b0c60;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/nodecache.c b/KernelLand/Kernel/vfs/nodecache.c index 0d238941..aee1826e 100644 --- a/KernelLand/Kernel/vfs/nodecache.c +++ b/KernelLand/Kernel/vfs/nodecache.c @@ -83,10 +83,17 @@ tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode) * \fn tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) */ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) +{ + return Inode_CacheNodeEx(Handle, Node, sizeof(*Node)); +} + +tVFS_Node *Inode_CacheNodeEx(int Handle, tVFS_Node *Node, size_t Size) { tInodeCache *cache; - tCachedInode *newEnt, *ent, *prev; - + tCachedInode *newEnt, *ent, *prev = NULL; + + ASSERT(Size >= sizeof(tVFS_Node)); + cache = Inode_int_GetFSCache(Handle); if(!cache) return NULL; @@ -95,7 +102,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; @@ -107,10 +113,13 @@ tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) } // Create new entity - newEnt = malloc(sizeof(tCachedInode)); + newEnt = malloc(sizeof(tCachedInode) + (Size - sizeof(tVFS_Node))); newEnt->Next = ent; - memcpy(&newEnt->Node, Node, sizeof(tVFS_Node)); - prev->Next = newEnt; + memcpy(&newEnt->Node, Node, Size); + if( prev ) + prev->Next = newEnt; + else + cache->FirstNode = newEnt; newEnt->Node.ReferenceCount = 1; LOG("Cached %llx as %p", Node->Inode, &newEnt->Node);