X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FFilesystems%2FFAT%2Fnodecache.c;h=c862dca54b675fb32466fe1912e57f4c445c4ec2;hb=0ea39901119279ee9bb9cf8270b2a0d65cb7460f;hp=e181e98e83212a20a098a953af86ee3de6c94161;hpb=d5d0dcb9b2daecbc88a972f74b39967f020faa15;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/FAT/nodecache.c b/KernelLand/Modules/Filesystems/FAT/nodecache.c index e181e98e..c862dca5 100644 --- a/KernelLand/Modules/Filesystems/FAT/nodecache.c +++ b/KernelLand/Modules/Filesystems/FAT/nodecache.c @@ -155,13 +155,14 @@ tVFS_Node *FAT_int_CacheNode(tFAT_VolInfo *Disk, const tVFS_Node *Node) return &cnode->Node; } -void FAT_int_DerefNode(tVFS_Node *Node) +int FAT_int_DerefNode(tVFS_Node *Node) { tFAT_VolInfo *Disk = Node->ImplPtr; tFAT_CachedNode *cnode, *prev = NULL; + int bFreed = 0; if( Node == &Disk->rootNode ) - return ; + return 0; Mutex_Acquire(&Disk->lNodeCache); Node->ReferenceCount --; @@ -175,15 +176,19 @@ void FAT_int_DerefNode(tVFS_Node *Node) break; } } + if(Node->ReferenceCount == 0 && cnode) { + // Already out of the list :) + free(cnode->Node.Data); + free(cnode); + bFreed = 1; + } Mutex_Release(&Disk->lNodeCache); if( !cnode ) { // Not here? - return ; + return -1; } - // Already out of the list :) - free(cnode->Node.Data); - free(cnode); + return bFreed; } void FAT_int_ClearNodeCache(tFAT_VolInfo *Disk)