X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fhandle.c;h=d500aa91b775d5edddab8515cd12fc7233d7caea;hb=6274aaa8894e14462a36c69090e2f9235f130e31;hp=cd4997d8cc4a3e34eb116ad1bc1c29c5bfd2155b;hpb=dcb9c2c08fe33d0d04511ec6f46bf1d1c5980236;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/handle.c b/KernelLand/Kernel/vfs/handle.c index cd4997d8..d500aa91 100644 --- a/KernelLand/Kernel/vfs/handle.c +++ b/KernelLand/Kernel/vfs/handle.c @@ -39,7 +39,7 @@ tVFS_Handle *VFS_GetHandle(int FD) if(FD >= MAX_KERNEL_FILES) return NULL; h = &gaKernelHandles[ FD ]; } else { - if(FD >= *Threads_GetMaxFD()) return NULL; + if(FD >= *Threads_GetMaxFD(NULL)) return NULL; h = &gaUserHandles[ FD ]; } @@ -59,7 +59,7 @@ int VFS_SetHandle(int FD, tVFS_Node *Node, int Mode) h = &gaKernelHandles[FD]; } else { - if( FD >= *Threads_GetMaxFD()) return -1; + if( FD >= *Threads_GetMaxFD(NULL)) return -1; h = &gaUserHandles[FD]; } h->Node = Node; @@ -72,19 +72,20 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) // Check for a user open if(bIsUser) { - int max_handles = *Threads_GetMaxFD(); + int max_handles = *Threads_GetMaxFD(NULL); // Allocate Buffer if( MM_GetPhysAddr( gaUserHandles ) == 0 ) { - Uint addr, size; - size = max_handles * sizeof(tVFS_Handle); - for(addr = 0; addr < size; addr += 0x1000) + tPage *pageptr = (void*)gaUserHandles; + size_t size = max_handles * sizeof(tVFS_Handle); + for( size_t ofs = 0; ofs < size; ofs ++) { - if( !MM_Allocate( (tVAddr)gaUserHandles + addr ) ) + if( !MM_Allocate( pageptr ) ) { Warning("OOM - VFS_AllocHandle"); Threads_Exit(0, 0xFF); // Terminate user } + pageptr ++; } memset( gaUserHandles, 0, size ); } @@ -103,15 +104,15 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) // Allocate space if not already if( MM_GetPhysAddr( gaKernelHandles ) == 0 ) { - Uint addr, size; - size = MAX_KERNEL_FILES * sizeof(tVFS_Handle); - for(addr = 0; addr < size; addr += 0x1000) + tPage *pageptr = (void*)gaKernelHandles; + size_t size = MAX_KERNEL_FILES * sizeof(tVFS_Handle); + for(size_t ofs = 0; ofs < size; ofs += size) { - if( !MM_Allocate( (tVAddr)gaKernelHandles + addr ) ) + if( !MM_Allocate( pageptr ) ) { Panic("OOM - VFS_AllocHandle"); - Threads_Exit(0, 0xFF); // Terminate application (get some space back) } + pageptr ++; } memset( gaKernelHandles, 0, size ); } @@ -131,14 +132,13 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) void VFS_ReferenceUserHandles(void) { - int i; - int max_handles = *Threads_GetMaxFD(); + const int max_handles = *Threads_GetMaxFD(NULL); // Check if this process has any handles if( MM_GetPhysAddr( gaUserHandles ) == 0 ) return ; - for( i = 0; i < max_handles; i ++ ) + for( int i = 0; i < max_handles; i ++ ) { tVFS_Handle *h; h = &gaUserHandles[i]; @@ -149,23 +149,34 @@ void VFS_ReferenceUserHandles(void) } } -void VFS_CloseAllUserHandles(void) +void VFS_CloseAllUserHandles(struct sProcess *Process) { - int i; - int max_handles = *Threads_GetMaxFD(); + const int max_handles = *Threads_GetMaxFD(Process); + ENTER("pProcess", Process); + if( max_handles >= PAGE_SIZE / sizeof(tVFS_Handle) ) + TODO("More than a page of handles"); + + tVFS_Handle *handles = MM_MapTempFromProc(Process, gaUserHandles); + LOG("handles=%p", handles); // Check if this process has any handles - if( MM_GetPhysAddr( gaUserHandles ) == 0 ) + if( !handles ) { + LEAVE('-'); return ; + } - for( i = 0; i < max_handles; i ++ ) + for( int i = 0; i < max_handles; i ++ ) { - tVFS_Handle *h; - h = &gaUserHandles[i]; + tVFS_Handle *h = &handles[i]; + LOG("handles[%i].Node = %p", i, h->Node); if( !h->Node ) continue ; _CloseNode(h->Node); + h->Node = NULL; } + + MM_FreeTemp(handles); + LEAVE('-'); } /** @@ -174,7 +185,7 @@ void VFS_CloseAllUserHandles(void) void *VFS_SaveHandles(int NumFDs, int *FDs) { tVFS_Handle *ret; - int max_handles = *Threads_GetMaxFD(); + const int max_handles = *Threads_GetMaxFD(NULL); // Check if this process has any handles if( MM_GetPhysAddr( gaUserHandles ) == 0 ) @@ -235,11 +246,16 @@ void *VFS_SaveHandles(int NumFDs, int *FDs) void VFS_RestoreHandles(int NumFDs, void *Handles) { tVFS_Handle *handles = Handles; - int max_handles = *Threads_GetMaxFD(); + const int max_handles = *Threads_GetMaxFD(NULL); // NULL = nothing to do if( !Handles ) - return ; + return ; + + if( NumFDs > max_handles ) { + Log_Notice("VFS", "RestoreHandles: Capping from %i FDs to %i", NumFDs, max_handles); + NumFDs = max_handles; + } // Allocate user handle area (and dereference existing handles) for( int i = 0; i < NumFDs; i ++ ) @@ -249,7 +265,7 @@ void VFS_RestoreHandles(int NumFDs, void *Handles) if( !MM_GetPhysAddr(h) ) { void *pg = (void*)( (tVAddr)h & ~(PAGE_SIZE-1) ); - if( !MM_Allocate( (tVAddr)pg ) ) + if( !MM_Allocate( pg ) ) { // OOM? return ;