Index: trunk/kernel/syscalls/sys_mkdir.c
===================================================================
--- trunk/kernel/syscalls/sys_mkdir.c	(revision 690)
+++ trunk/kernel/syscalls/sys_mkdir.c	(revision 1)
@@ -1,16 +1,15 @@
 /*
- * sys_mkdir.c - creates a new directory in VFS 
- *
- * Author     Alain Greiner (2016,2017,2018)
- *
- * Copyright (c)  UPMC Sorbonne Universites
+ * kern/sys_mkdir.c - creates new directory
+ * 
+ * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless
+ * Copyright (c) 2011,2012 UPMC Sorbonne Universites
  *
  * This file is part of ALMOS-kernel.
  *
- * ALMOS-MKH is free software; you can redistribute it and/or modify it
+ * ALMOS-kernel is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
  * the Free Software Foundation; version 2.0 of the License.
  *
- * ALMOS-MKH is distributed in the hope that it will be useful, but
+ * ALMOS-kernel is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
@@ -18,102 +17,30 @@
  *
  * You should have received a copy of the GNU General Public License
- * along with ALMOS-MKH; if not, write to the Free Software Foundation,
+ * along with ALMOS-kernel; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include <kernel_config.h>
-#include <hal_kernel_types.h>
-#include <hal_uspace.h>
-#include <errno.h>
 #include <vfs.h>
-#include <process.h>
+#include <sys-vfs.h>
+#include <task.h>
 #include <thread.h>
-#include <printk.h>
 
-#include <syscalls.h>
+int sys_mkdir (char *pathname, uint_t mode)
+{
+	register error_t err = 0;
+	struct task_s *task = current_task;
+	struct ku_obj ku_path;
 
-////////////////////////////////////
-int sys_mkdir ( char     * pathname,
-                uint32_t   rights __attribute__((unused)) )
-{
-    error_t   error;
-    xptr_t    root_inode_xp;                     // extended pointer on root inode
-    char      kbuf[CONFIG_VFS_MAX_PATH_LENGTH];
+	KU_BUFF(ku_path, pathname);
+	rwlock_rdlock(&task->cwd_lock);
 
-    thread_t     * this     = CURRENT_THREAD;
-    process_t    * process  = this->process;
-
-#if (DEBUG_SYS_MKDIR || CONFIG_INSTRUMENTATION_SYSCALLS)
-uint64_t     tm_start = hal_get_cycles();
-#endif
-
-    // check pathname length
-    if( hal_strlen_from_uspace( pathname ) >= CONFIG_VFS_MAX_PATH_LENGTH )
-    {
-
-#if DEBUG_SYSCALLS_ERROR
-printk("\n[ERROR] in %s : pathname too long\n", __FUNCTION__ );
-#endif
-        this->errno = ENFILE;
-        return -1;
-    }
-
-    // copy pathname in kernel space
-    hal_strcpy_from_uspace( XPTR( local_cxy , kbuf ),
-                            pathname,
-                            CONFIG_VFS_MAX_PATH_LENGTH );
-
-#if DEBUG_SYS_MKDIR
-if( DEBUG_SYS_MKDIR < tm_start )
-printk("\n[%s] thread[%x,%x] enter for <%s> / cycle %d\n",
-__FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_start );
-#endif
- 
-    // compute root inode for path 
-    if( kbuf[0] == '/' )                        // absolute path
-    {
-        // use extended pointer on VFS root inode
-        root_inode_xp = process->vfs_root_xp;
-    }
-    else                                        // relative path
-    {
-        // get cluster and local pointer on reference process
-        xptr_t      ref_xp  = process->ref_xp;
-        process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );
-        cxy_t       ref_cxy = GET_CXY( ref_xp );
-
-        // use extended pointer on CWD inode
-        root_inode_xp = hal_remote_l64( XPTR( ref_cxy , &ref_ptr->cwd_xp ) );
-    }
-
-    // call relevant VFS function
-    error  = vfs_mkdir( root_inode_xp , kbuf , rights );
-
-    if( error )
-    {
-
-#if DEBUG_SYSCALLS_ERROR
-printk("\n[ERROR] in %s : cannot create directory <%s>\n", __FUNCTION__, kbuf );
-#endif
-        this->errno = ENFILE;
-        return -1;
-    }
-
-#if (DEBUG_SYS_MKDIR || CONFIG_INSTRUMENTATION_SYSCALLS)
-uint64_t     tm_end = hal_get_cycles();
-#endif
-
-#if DEBUG_SYS_MKDIR
-if( DEBUG_SYS_MKDIR < tm_end )
-printk("\n[%s] thread[%x,%x] exit for <%s> / cycle %d\n",
-__FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_end );
-#endif
- 
-#if CONFIG_INSTRUMENTATION_SYSCALLS
-hal_atomic_add( &syscalls_cumul_cost[SYS_MKDIR] , tm_end - tm_start );
-hal_atomic_add( &syscalls_occurences[SYS_MKDIR] , 1 );
-#endif
-
-    return 0;
-
-} // end sys_mkdir()
+	if((err = vfs_mkdir(&task->vfs_cwd, &ku_path, mode)))
+	{
+		current_thread->info.errno = (err < 0) ? -err : err;
+		rwlock_unlock(&task->cwd_lock);
+		return -1;
+	}
+   
+	rwlock_unlock(&task->cwd_lock);
+	return 0;
+}
