X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fproc.c;h=9c7d909ac3d94c9ebce7561aae294ddba5737eb9;hb=35bd78fa5f141882c43b1bcaa0c90436ff3974f1;hp=1e0c6bd842dd69ba89b2edfb694b953a38dff1da;hpb=4ebe00546574e97c5316881881f7f2562deea74b;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/proc.c b/KernelLand/Kernel/drv/proc.c index 1e0c6bd8..9c7d909a 100644 --- a/KernelLand/Kernel/drv/proc.c +++ b/KernelLand/Kernel/drv/proc.c @@ -276,14 +276,15 @@ int SysFS_RemoveFile(int ID) tSysFS_Ent *ent, *parent, *prev; prev = NULL; - for( ent = gSysFS_FileList; ent; prev = ent, ent = ent->Next ) + for( ent = gSysFS_FileList; ent; prev = ent, ent = ent->ListNext ) { // It's a reverse sorted list - if(ent->Node.Inode < (Uint64)ID) return 0; - if(ent->Node.Inode == (Uint64)ID) break; + if(ent->Node.Inode <= (Uint64)ID) break; + } + if( !ent || ent->Node.Inode != (Uint64)ID) { + Log_Notice("SysFS", "ID %i not present", ID); + return 0; } - - if(!ent) return 0; // Set up for next part file = ent; @@ -297,26 +298,37 @@ int SysFS_RemoveFile(int ID) file->Node.Size = 0; file->Node.ImplPtr = NULL; - // Search parent directory - for( ent = parent->Node.ImplPtr; ent; prev = ent, ent = ent->Next ) + // Clean out of parent directory + while(parent) { - if( ent == file ) break; - } - if(!ent) { - Log_Warning("SysFS", "Bookkeeping Error: File in list, but not in directory"); - return 0; + for( ent = parent->Node.ImplPtr; ent; prev = ent, ent = ent->Next ) + { + if( ent == file ) break; + } + if(!ent) { + Log_Warning("SysFS", "Bookkeeping Error: File in list, but not in directory"); + return 0; + } + + // Remove from parent directory + if(prev) + prev->Next = ent->Next; + else + parent->Node.ImplPtr = ent->Next; + + // Free if not in use + if(file->Node.ReferenceCount == 0) { + free(file); + } + + if( parent->Node.ImplPtr ) + break; + + // Remove parent from the tree + file = parent; + parent = parent->Parent; } - // Remove from parent directory - if(prev) - prev->Next = ent->Next; - else - parent->Node.ImplPtr = ent->Next; - - // Free if not in use - if(file->Node.ReferenceCount == 0) - free(file); - return 1; }