Unset errno when VFS fails
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Nov 2013 23:06:35 +0000 (15:06 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:33:18 +0000 (11:33 -0800)
When the VFS fails an open or similar call, it sets errno.  When 9ns
succeeds, errno is still set.

While this is acceptable use of errno (should only check it if you know
the call failed, in a call-specific manner), Go has trouble with this
(at least our Go).  I'm fine with dealing with this in-kernel, though I
don't promise to not touch errno in the case of success.

Note this commit is applied with no 9ns stuff in place (like in open and
stat).

kern/include/syscall.h
kern/src/syscall.c

index a195d72..07c4999 100644 (file)
@@ -45,6 +45,7 @@ void run_local_syscall(struct syscall *sysc);
 intreg_t syscall(struct proc *p, uintreg_t sc_num, uintreg_t a0, uintreg_t a1,
                  uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5);
 void set_errno(int errno);
+void unset_errno(void);
 void set_errstr(char *errstr, ...);
 char *current_errstr(void);
 struct errbuf *get_cur_errbuf(void);
index 2903c29..58b6895 100644 (file)
@@ -102,6 +102,15 @@ void set_errno(int errno)
                pcpui->cur_kthread->sysc->err = errno;
 }
 
+void unset_errno(void)
+{
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       if (!pcpui->cur_kthread || !pcpui->cur_kthread->sysc)
+               return;
+       pcpui->cur_kthread->sysc->err = 0;
+       pcpui->cur_kthread->sysc->errstr[0] = '\0';
+}
+
 void set_errstr(char *fmt, ...)
 {
        va_list ap;
@@ -314,6 +323,7 @@ static int sys_proc_create(struct proc *p, char *path, size_t path_l,
        t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        program = do_file_open(t_path, 0, 0);
        user_memdup_free(p, t_path);
        if (!program)
@@ -549,6 +559,7 @@ static int sys_exec(struct proc *p, char *path, size_t path_l,
        pcpui->cur_ctx = 0;
        enable_irqsave(&state);
        /* This could block: */
+       /* TODO: 9ns support */
        program = do_file_open(t_path, 0, 0);
        user_memdup_free(p, t_path);
        if (!program)
@@ -1320,6 +1331,7 @@ static intreg_t sys_access(struct proc *p, const char *path, size_t path_l,
        char *t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        retval = do_access(t_path, mode);
        user_memdup_free(p, t_path);
        printd("Access for path: %s retval: %d\n", path, retval);
@@ -1343,6 +1355,7 @@ intreg_t sys_chmod(struct proc *p, const char *path, size_t path_l, int mode)
        char *t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        retval = do_chmod(t_path, mode);
        user_memdup_free(p, t_path);
        if (retval < 0) {
@@ -1402,6 +1415,7 @@ intreg_t sys_unlink(struct proc *p, const char *path, size_t path_l)
        char *t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        retval = do_unlink(t_path);
        user_memdup_free(p, t_path);
        return retval;
@@ -1434,6 +1448,7 @@ intreg_t sys_readlink(struct proc *p, char *path, size_t path_l,
        char *t_path = user_strdup_errno(p, path, path_l);
        if (t_path == NULL)
                return -1;
+       /* TODO: 9ns support */
        path_d = lookup_dentry(t_path, 0);
        user_memdup_free(p, t_path);
        if (!path_d)
@@ -1455,6 +1470,7 @@ intreg_t sys_chdir(struct proc *p, const char *path, size_t path_l)
        char *t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        retval = do_chdir(&p->fs_env, t_path);
        user_memdup_free(p, t_path);
        if (retval) {
@@ -1485,6 +1501,7 @@ intreg_t sys_mkdir(struct proc *p, const char *path, size_t path_l, int mode)
        if (!t_path)
                return -1;
        mode &= ~p->fs_env.umask;
+       /* TODO: 9ns support */
        retval = do_mkdir(t_path, mode);
        user_memdup_free(p, t_path);
        return retval;
@@ -1496,6 +1513,7 @@ intreg_t sys_rmdir(struct proc *p, const char *path, size_t path_l)
        char *t_path = user_strdup_errno(p, path, path_l);
        if (!t_path)
                return -1;
+       /* TODO: 9ns support */
        retval = do_rmdir(t_path);
        user_memdup_free(p, t_path);
        return retval;