Changeset 610 for trunk/kernel/syscalls/sys_mkdir.c
- Timestamp:
- Dec 27, 2018, 7:38:58 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_mkdir.c
r566 r610 1 1 /* 2 * sys_mkdir.c - Create a new directory in file system.2 * sys_mkdir.c - creates a new directory in VFS 3 3 * 4 * Author Alain Greiner (2016,2017)4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 * Copyright (c) UPMC Sorbonne Universites6 * Copyright (c) UPMC Sorbonne Universites 7 7 * 8 * This file is part of ALMOS- MKH.8 * This file is part of ALMOS-kernel. 9 9 * 10 10 * ALMOS-MKH is free software; you can redistribute it and/or modify it … … 22 22 */ 23 23 24 #include <kernel_config.h> 24 25 #include <hal_kernel_types.h> 25 26 #include <hal_uspace.h> 27 #include <errno.h> 26 28 #include <vfs.h> 27 #include <vmm.h>28 #include <errno.h>29 29 #include <process.h> 30 30 #include <thread.h> 31 31 #include <printk.h> 32 32 33 /////////////////////////////////// 34 int sys_mkdir( char * pathname, 35 uint32_t mode __attribute__((unused)) ) 33 #include <syscalls.h> 34 35 //////////////////////////////////// 36 int sys_mkdir ( char * pathname, 37 uint32_t rights __attribute__((unused)) ) 36 38 { 37 error_t error; 38 char kbuf[CONFIG_VFS_MAX_PATH_LENGTH]; 39 error_t error; 40 xptr_t root_inode_xp; // extended pointer on root inode 41 char kbuf[CONFIG_VFS_MAX_PATH_LENGTH]; 39 42 40 43 thread_t * this = CURRENT_THREAD; 41 44 process_t * process = this->process; 42 45 43 // check fd_array not full 44 if( process_fd_array_full() ) 46 #if (DEBUG_SYS_MKDIR || CONFIG_INSTRUMENTATION_SYSCALLS) 47 uint64_t tm_start = hal_get_cycles(); 48 #endif 49 50 // check pathname length 51 if( hal_strlen_from_uspace( pathname ) >= CONFIG_VFS_MAX_PATH_LENGTH ) 45 52 { 46 printk("\n[ERROR] in %s : file descriptor array full for process %x\n", 47 __FUNCTION__ , process->pid ); 53 54 #if DEBUG_SYSCALLS_ERROR 55 printk("\n[ERROR] in %s : pathname too long\n", __FUNCTION__ ); 56 #endif 48 57 this->errno = ENFILE; 49 58 return -1; 50 59 } 51 60 52 // check pathname length 53 if( hal_strlen_from_uspace( pathname ) >= CONFIG_VFS_MAX_PATH_LENGTH ) 61 // copy pathname in kernel space 62 hal_strcpy_from_uspace( kbuf , pathname , CONFIG_VFS_MAX_PATH_LENGTH ); 63 64 #if DEBUG_SYS_MKDIR 65 if( DEBUG_SYS_MKDIR < tm_start ) 66 printk("\n[%s] thread[%x,%x] enter for <%s> / cycle %d\n", 67 __FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_start ); 68 #endif 69 70 // compute root inode for path 71 if( kbuf[0] == '/' ) // absolute path 54 72 { 55 printk("\n[ERROR] in %s : pathname too long\n", __FUNCTION__ ); 73 // use extended pointer on VFS root inode 74 root_inode_xp = process->vfs_root_xp; 75 } 76 else // relative path 77 { 78 // get cluster and local pointer on reference process 79 xptr_t ref_xp = process->ref_xp; 80 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp ); 81 cxy_t ref_cxy = GET_CXY( ref_xp ); 82 83 // use extended pointer on CWD inode 84 root_inode_xp = hal_remote_l64( XPTR( ref_cxy , &ref_ptr->cwd_xp ) ); 85 } 86 87 // call relevant VFS function 88 error = vfs_mkdir( root_inode_xp , kbuf , rights ); 89 90 if( error ) 91 { 92 93 #if DEBUG_SYSCALLS_ERROR 94 printk("\n[ERROR] in %s : cannot create directory <%s>\n", __FUNCTION__, kbuf ); 95 #endif 56 96 this->errno = ENFILE; 57 97 return -1; 58 98 } 59 99 60 printk("\n[ERROR] in %s : not implemented yet\n", __FUNCTION__ ); 61 return -1; 62 63 // copy pathname in kernel space 64 hal_strcpy_from_uspace( kbuf , pathname , CONFIG_VFS_MAX_PATH_LENGTH ); 100 #if (DEBUG_SYS_MKDIR || CONFIG_INSTRUMENTATION_SYSCALLS) 101 uint64_t tm_end = hal_get_cycles(); 102 #endif 65 103 66 // get cluster and local pointer on reference process 67 // xptr_t ref_xp = process->ref_xp; 68 // process_t * ref_ptr = (process_t *)GET_PTR( ref_xp ); 69 // cxy_t ref_cxy = GET_CXY( ref_xp ); 70 71 // get extended pointer on cwd inode 72 // xptr_t cwd_xp = hal_remote_l64( XPTR( ref_cxy , &ref_ptr->vfs_cwd_xp ) ); 73 74 // get the cwd lock in read mode from reference process 75 // remote_rwlock_rd_lock( XPTR( ref_cxy , &ref_ptr->cwd_lock ) ); 76 77 // call the relevant VFS function 78 // error = vfs_mkdir( cwd_xp, 79 // kbuf, 80 // mode ); 81 82 // release the cwd lock 83 // remote_rwlock_rd_unlock( XPTR( ref_cxy , &ref_ptr->cwd_lock ) ); 84 85 if( error ) 86 { 87 printk("\n[ERROR] in %s : cannot create directory %s\n", 88 __FUNCTION__ , kbuf ); 89 this->errno = error; 90 return -1; 91 } 104 #if DEBUG_SYS_MKDIR 105 if( DEBUG_SYS_MKDIR < tm_end ) 106 printk("\n[%s] thread[%x,%x] exit for <%s> / cycle %d\n", 107 __FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_end ); 108 #endif 109 110 #if CONFIG_INSTRUMENTATION_SYSCALLS 111 hal_atomic_add( &syscalls_cumul_cost[SYS_MKDIR] , tm_end - tm_start ); 112 hal_atomic_add( &syscalls_occurences[SYS_MKDIR] , 1 ); 113 #endif 92 114 93 115 return 0; 94 } 116 117 } // end sys_mkdir()
Note: See TracChangeset
for help on using the changeset viewer.