Fixes insert_file()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Aug 2014 22:13:11 +0000 (15:13 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Aug 2014 22:13:11 +0000 (15:13 -0700)
__claim_fd() returns a status, not a value.

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

index 65df904..5f67e79 100644 (file)
@@ -479,7 +479,8 @@ void file_release(struct kref *kref);
 /* Process-related File management functions */
 struct file *get_file_from_fd(struct files_struct *open_files, int fd);
 struct file *put_file_from_fd(struct files_struct *open_files, int file_desc);
-int insert_file(struct files_struct *open_files, struct file *file, int low_fd, int must);
+int insert_file(struct files_struct *open_files, struct file *file, int low_fd,
+                bool must);
 void close_all_files(struct files_struct *open_files, bool cloexec);
 void clone_files(struct files_struct *src, struct files_struct *dst);
 int do_chdir(struct fs_struct *fs_env, char *path);
index 1857c04..01f57cd 100644 (file)
@@ -389,9 +389,9 @@ error_t proc_alloc(struct proc **pp, struct proc *parent, int flags)
                        clone_files(&parent->open_files, &p->open_files);
        } else {
                /* no parent, we're created from the kernel */
-               assert(insert_file(&p->open_files, dev_stdin,  0, 0) == 0);
-               assert(insert_file(&p->open_files, dev_stdout, 1, 0) == 1);
-               assert(insert_file(&p->open_files, dev_stderr, 2, 0) == 2);
+               assert(insert_file(&p->open_files, dev_stdin,  0, TRUE) == 0);
+               assert(insert_file(&p->open_files, dev_stdout, 1, TRUE) == 1);
+               assert(insert_file(&p->open_files, dev_stderr, 2, TRUE) == 2);
        }
        /* Init the ucq hash lock */
        p->ucq_hashlock = (struct hashlock*)&p->ucq_hl_noref;
index 6e4cddb..464a5c1 100644 (file)
@@ -1180,7 +1180,8 @@ static intreg_t sys_open(struct proc *p, const char *path, size_t path_l,
        file = do_file_open(t_path, oflag, mode);
        /* VFS */
        if (file) {
-               fd = insert_file(&p->open_files, file, 0, 0);   /* stores the ref to file */
+               /* stores the ref to file */
+               fd = insert_file(&p->open_files, file, 0, FALSE);
                kref_put(&file->f_kref);        /* drop our ref */
                if (fd < 0)
                        warn("File insertion failed");
@@ -1348,7 +1349,7 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
 
        switch (cmd) {
                case (F_DUPFD):
-                       retval = insert_file(&p->open_files, file, arg, 0);
+                       retval = insert_file(&p->open_files, file, arg, FALSE);
                        if (retval < 0) {
                                set_errno(-retval);
                                retval = -1;
index e333612..bc43859 100644 (file)
@@ -2245,14 +2245,22 @@ int claim_fd(struct files_struct *open_files, int file_desc)
 
 /* Inserts the file in the files_struct, returning the corresponding new file
  * descriptor, or an error code.  We start looking for open fds from low_fd. */
-int insert_file(struct files_struct *open_files, struct file *file, int low_fd, int must)
+int insert_file(struct files_struct *open_files, struct file *file, int low_fd,
+                bool must)
 {
-       int slot;
+       int slot, ret;
        spin_lock(&open_files->lock);
-       if (must)
-               slot = __claim_fd(open_files, low_fd);
-       else
+       if (must) {
+               ret = __claim_fd(open_files, low_fd);
+               if (ret < 0) {
+                       spin_unlock(&open_files->lock);
+                       return ret;
+               }
+               assert(!ret);   /* issues with claim_fd returning status, not the fd */
+               slot = low_fd;
+       } else {
                slot = __get_fd(open_files, low_fd);
+       }
 
        if (slot < 0) {
                spin_unlock(&open_files->lock);