X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FFilesystems%2FFAT%2Fdir.c;h=f5445fd51567e7c3f37d17ddf740112484e851e7;hb=13078002b01ee4f63eb2001d2ef479a2a006ea32;hp=b74b31ff9efa6937133678c211765db5638b9217;hpb=4ebe00546574e97c5316881881f7f2562deea74b;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/FAT/dir.c b/KernelLand/Modules/Filesystems/FAT/dir.c index b74b31ff..f5445fd5 100644 --- a/KernelLand/Modules/Filesystems/FAT/dir.c +++ b/KernelLand/Modules/Filesystems/FAT/dir.c @@ -27,7 +27,7 @@ Uint16 *FAT_int_GetLFN(tVFS_Node *Node, int ID); void FAT_int_DelLFN(tVFS_Node *Node, int ID); #endif int FAT_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX]); -tVFS_Node *FAT_FindDir(tVFS_Node *Node, const char *Name); +tVFS_Node *FAT_FindDir(tVFS_Node *Node, const char *Name, Uint Flags); tVFS_Node *FAT_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode); #if SUPPORT_WRITE tVFS_Node *FAT_Mknod(tVFS_Node *Node, const char *Name, Uint Flags); @@ -83,6 +83,7 @@ int FAT_int_CreateName(fat_filetable *ft, const Uint16 *LongFileName, char *Dest { int len = FAT_int_ConvertUTF16_to_UTF8(NULL, LongFileName); if( len > FILENAME_MAX ) { + LEAVE('i', -1); return -1; } FAT_int_ConvertUTF16_to_UTF8((Uint8*)Dest, LongFileName); @@ -94,6 +95,7 @@ int FAT_int_CreateName(fat_filetable *ft, const Uint16 *LongFileName, char *Dest #if USE_LFN } #endif + LEAVE('i', 0); return 0; } @@ -278,7 +280,10 @@ int FAT_int_GetEntryByCluster(tVFS_Node *DirNode, Uint32 Cluster, fat_filetable fat_filetable fileinfo[ents_per_sector]; int i, sector; - Mutex_Acquire(&DirNode->Lock); + if( Mutex_Acquire(&DirNode->Lock) ) { + return -EINTR; + } + sector = 0; for( i = 0; ; i ++ ) { @@ -318,7 +323,7 @@ int FAT_int_GetEntryByCluster(tVFS_Node *DirNode, Uint32 Cluster, fat_filetable } Mutex_Release(&DirNode->Lock); - return -1; + return -ENOENT; } /* @@ -442,13 +447,12 @@ int FAT_int_WriteDirEntry(tVFS_Node *Node, int ID, fat_filetable *Entry) */ Uint16 *FAT_int_GetLFN(tVFS_Node *Node, int ID) { - tFAT_LFNCache *cache; - int i, firstFree; - - Mutex_Acquire( &Node->Lock ); + if( Mutex_Acquire( &Node->Lock ) ) { + return NULL; + } // TODO: Thread Safety (Lock things) - cache = Node->Data; + tFAT_LFNCache *cache = Node->Data; // Create a cache if it isn't there if(!cache) { @@ -462,8 +466,8 @@ Uint16 *FAT_int_GetLFN(tVFS_Node *Node, int ID) } // Scan for this entry - firstFree = -1; - for( i = 0; i < cache->NumEntries; i++ ) + int firstFree = -1; + for( int i = 0; i < cache->NumEntries; i++ ) { if( cache->Entries[i].ID == ID ) { Mutex_Release( &Node->Lock ); @@ -474,31 +478,35 @@ Uint16 *FAT_int_GetLFN(tVFS_Node *Node, int ID) firstFree = i; } - if(firstFree == -1) { - // Use `i` for temp length - i = sizeof(tFAT_LFNCache) + (cache->NumEntries+1)*sizeof(tFAT_LFNCacheEnt); - Node->Data = realloc( Node->Data, i ); - if( !Node->Data ) { - Log_Error("FAT", "realloc() fail, unable to allocate %i for LFN cache", i); + int cache_entry = firstFree; + + if(firstFree == -1) + { + size_t newsize = offsetof(tFAT_LFNCache, Entries[cache->NumEntries+1]); + tFAT_LFNCache *new_alloc = realloc( Node->Data, newsize ); + if( !new_alloc ) { + Log_Error("FAT", "realloc() fail, unable to allocate %zi for LFN cache", newsize); Mutex_Release( &Node->Lock ); return NULL; } + Node->Data = new_alloc; //Log_Debug("FAT", "Realloc (%i)\n", i); cache = Node->Data; - i = cache->NumEntries; + cache_entry = cache->NumEntries; cache->NumEntries ++; } - else { - i = firstFree; + else + { + cache_entry = firstFree; } // Create new entry - cache->Entries[ i ].ID = ID; - cache->Entries[ i ].Data[0] = '\0'; + cache->Entries[ cache_entry ].ID = ID; + cache->Entries[ cache_entry ].Data[0] = '\0'; Mutex_Release( &Node->Lock ); //Log_Debug("FAT", "Return = %p (firstFree, i = %i)", cache->Entries[i].Data, i); - return cache->Entries[ i ].Data; + return cache->Entries[ cache_entry ].Data; } /** @@ -623,7 +631,7 @@ int FAT_ReadDir(tVFS_Node *Node, int ID, char Dest[FILENAME_MAX]) * \fn tVFS_Node *FAT_FindDir(tVFS_Node *node, char *name) * \brief Finds an entry in the current directory */ -tVFS_Node *FAT_FindDir(tVFS_Node *Node, const char *Name) +tVFS_Node *FAT_FindDir(tVFS_Node *Node, const char *Name, Uint Flags) { fat_filetable fileent; @@ -659,6 +667,7 @@ tVFS_Node *FAT_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode) if( ret ) { if( (ret->Inode >> 32) != 0 ) { LOG("Node in cache, quick return"); + LEAVE('p', ret); return ret; } else { @@ -812,7 +821,9 @@ int FAT_Link(tVFS_Node *DirNode, const char *NewName, tVFS_Node *NewNode) const int eps = 512 / sizeof(fat_filetable); fat_filetable fileinfo[eps]; - Mutex_Acquire( &DirNode->Lock ); + if( Mutex_Acquire( &DirNode->Lock ) ) { + return EINTR; + } // -- Ensure duplicates aren't created -- if( FAT_int_GetEntryByName(DirNode, NewName, &ft) >= 0 ) { @@ -1096,7 +1107,9 @@ int FAT_Unlink(tVFS_Node *Node, const char *OldName) tVFS_Node *child; fat_filetable ft; - Mutex_Acquire(&Node->Lock); + if( Mutex_Acquire(&Node->Lock) ) { + return EINTR; + } int id = FAT_int_GetEntryByName(Node, OldName, &ft); if(id == -1) {