Fixes chdir retval
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Aug 2014 01:22:21 +0000 (18:22 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Aug 2014 01:22:21 +0000 (18:22 -0700)
Was returning -errno on errors, instead of -1.  Also, this cleans up the
discrepancy betweren how do_chdir() and do_fchdir() handle errno and return
values.

kern/src/syscall.c
kern/src/vfs.c

index e57a642..d5a6d00 100644 (file)
@@ -1503,9 +1503,6 @@ static int sys_chdir(struct proc *p, pid_t pid, const char *path, size_t path_l)
        }
        /* TODO: 9ns support */
        retval = do_chdir(&target->fs_env, t_path);
-       /* do_chdir doesn't set errno (though fchdir does) */
-       if (retval)
-               set_errno(-retval);
        user_memdup_free(p, t_path);
        proc_decref(target);
        return retval;
index d717dcc..7f4746f 100644 (file)
@@ -2582,18 +2582,21 @@ static void __chpwd(struct fs_struct *fs_env, struct dentry *new_pwd)
 }
 
 /* Change the working directory of the given fs env (one per process, at this
- * point).  Returns 0 for success, -ERROR for whatever error. */
+ * point).  Returns 0 for success, sets errno and returns -1 otherwise. */
 int do_chdir(struct fs_struct *fs_env, char *path)
 {
        struct nameidata nd_r = {0}, *nd = &nd_r;
-       int retval;
-       retval = path_lookup(path, LOOKUP_DIRECTORY, nd);
-       if (!retval) {
-               /* nd->dentry is the place we want our PWD to be */
-               __chpwd(fs_env, nd->dentry);
+       int error;
+       error = path_lookup(path, LOOKUP_DIRECTORY, nd);
+       if (error) {
+               set_errno(-error);
+               path_release(nd);
+               return -1;
        }
+       /* nd->dentry is the place we want our PWD to be */
+       __chpwd(fs_env, nd->dentry);
        path_release(nd);
-       return retval;
+       return 0;
 }
 
 int do_fchdir(struct fs_struct *fs_env, struct file *file)