diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-04-25 04:04:20 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-04-25 04:04:20 +0000 |
commit | 88db52baebd10ab1c2643f214ab9d44edcdb0851 (patch) | |
tree | f365ba758acd1bf164429cfbc02790e0ebbf8a79 | |
parent | a3e64ef2bf31dda9a94db011a96651de918ea968 (diff) |
fix refcount issue
-rw-r--r-- | kernel/fs/namev.c | 2 | ||||
-rw-r--r-- | kernel/fs/open.c | 4 | ||||
-rw-r--r-- | kernel/fs/vfs_syscall.c | 30 | ||||
-rw-r--r-- | kernel/fs/vnode_specials.c | 2 | ||||
-rw-r--r-- | kernel/proc/proc.c | 28 | ||||
-rw-r--r-- | kernel/util/debug.c | 2 |
6 files changed, 33 insertions, 35 deletions
diff --git a/kernel/fs/namev.c b/kernel/fs/namev.c index 343f02c..5146165 100644 --- a/kernel/fs/namev.c +++ b/kernel/fs/namev.c @@ -232,7 +232,7 @@ long namev_dir(vnode_t *base, const char *path, vnode_t **res_vnode, vref(dir); // Tokenize the path - const char *token = NULL; + char *token = NULL; size_t len = 0; while ((token = namev_tokenize(&path, &len)) && len > 0) { diff --git a/kernel/fs/open.c b/kernel/fs/open.c index 811a9c4..8f0d893 100644 --- a/kernel/fs/open.c +++ b/kernel/fs/open.c @@ -100,6 +100,7 @@ long do_open(const char *filename, int oflags) // Check if the vnode is a directory if (S_ISDIR(res_vnode->vn_mode) && ((oflags & O_WRONLY) || (oflags & O_RDWR))) { + vput(&res_vnode); return -EISDIR; } @@ -156,9 +157,6 @@ long do_open(const char *filename, int oflags) return -ENOMEM; } - - // Set the file descriptor - // curproc->p_files[fd] = file; vput(&res_vnode); return fd; } diff --git a/kernel/fs/vfs_syscall.c b/kernel/fs/vfs_syscall.c index ba4aa0c..205020b 100644 --- a/kernel/fs/vfs_syscall.c +++ b/kernel/fs/vfs_syscall.c @@ -143,8 +143,7 @@ ssize_t do_write(int fd, const void *buf, size_t len) // Check if the write was successful if (bytes_written < 0) { - // fput(&file); - dbg(DBG_PRINT, "VFS: do_write: write failed\n"); + fput(&file); return bytes_written; } @@ -182,8 +181,8 @@ long do_close(int fd) } // Close the file - curproc->p_files[fd] = NULL; fput(&file); + fput(&curproc->p_files[fd]); return 0; } @@ -219,6 +218,7 @@ long do_dup(int fd) long ret = get_empty_fd(&new_fd); if (ret < 0) { + fput(&file); return ret; } @@ -266,6 +266,7 @@ long do_dup2(int ofd, int nfd) file_t *new_file = fget(nfd); if (new_file != NULL) { + fput(&new_file); do_close(nfd); } @@ -305,6 +306,7 @@ long do_mknod(const char *path, int mode, devid_t devid) vnode_t *vnode = NULL; vnode_t *base = curproc->p_cwd; long ret = namev_open(base, path, O_CREAT, mode, devid, &vnode); + vput(&vnode); return ret; } @@ -367,10 +369,16 @@ long do_mkdir(const char *path) } // Create the directory - ret = dir->vn_ops->mkdir(dir, name, len, &base); - // vput(&base); + long err = dir->vn_ops->mkdir(dir, name, len, &base); + if (err < 0) + { + vput(&dir); + return err; + } + + vput(&base); vput(&dir); - return ret; + return 0; } /* @@ -452,11 +460,11 @@ long do_rmdir(const char *path) return -ENOTDIR; } + vput(&base); // Remove the directory vlock(dir); ret = dir->vn_ops->rmdir(dir, name, len); vunlock(dir); - vput(&base); vput(&dir); return ret; @@ -524,12 +532,11 @@ long do_unlink(const char *path) return -EPERM; } + vput(&base); // Call the unlink operation vlock(dir); ret = dir->vn_ops->unlink(dir, name, len); vunlock(dir); - - vput(&base); vput(&dir); return ret; @@ -587,14 +594,12 @@ long do_link(const char *oldpath, const char *newpath) if (!S_ISDIR(dir->vn_mode)) { vput(&old_vnode); - vput(&dir); return -ENOTDIR; } // Check if name is too long if (len > NAME_LEN) { vput(&old_vnode); - vput(&dir); return -ENAMETOOLONG; } @@ -657,7 +662,6 @@ long do_rename(const char *oldpath, const char *newpath) // Check if the old directory is a directory if (!S_ISDIR(old_dir->vn_mode)) { - vput(&old_dir); return -ENOTDIR; } @@ -676,7 +680,6 @@ long do_rename(const char *oldpath, const char *newpath) if (!S_ISDIR(new_dir->vn_mode)) { vput(&old_dir); - vput(&new_dir); return -ENOTDIR; } @@ -684,7 +687,6 @@ long do_rename(const char *oldpath, const char *newpath) if (old_len > NAME_LEN || new_len > NAME_LEN) { vput(&old_dir); - vput(&new_dir); return -ENAMETOOLONG; } diff --git a/kernel/fs/vnode_specials.c b/kernel/fs/vnode_specials.c index 3e55830..fb6df0b 100644 --- a/kernel/fs/vnode_specials.c +++ b/kernel/fs/vnode_specials.c @@ -124,8 +124,6 @@ static ssize_t chardev_file_read(vnode_t *file, size_t pos, void *buf, vlock(file); return ret; - - return 0; } /* diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 1e38ca8..91be451 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -260,6 +260,20 @@ void proc_cleanup(long status) // NOT_YET_IMPLEMENTED("PROCS: proc_cleanup"); dbg(DBG_PROC, "proc_cleanup called on proc with pid=%d with exit status=%d\n", curproc->p_pid, status); +#ifdef __VFS__ + for (int fd = 0; fd < NFILES; fd++) + { + if (curproc->p_files[fd]) + { + fput(curproc->p_files + fd); + } + } + if (curproc->p_cwd) + { + vput(&curproc->p_cwd); + } +#endif + if (curproc->p_pid == PID_INIT) { @@ -289,20 +303,6 @@ void proc_cleanup(long status) // } else { curproc->p_status = status; // } - -#ifdef __VFS__ - for (int fd = 0; fd < NFILES; fd++) - { - if (curproc->p_files[fd]) - { - fput(curproc->p_files + fd); - } - } - if (curproc->p_cwd) - { - vput(&curproc->p_cwd); - } -#endif } /* diff --git a/kernel/util/debug.c b/kernel/util/debug.c index ba38c24..027c05f 100644 --- a/kernel/util/debug.c +++ b/kernel/util/debug.c @@ -19,7 +19,7 @@ * always be the first thing in this variable. Note that this setting can be * changed at runtime by modifying the dbg_modes global variable. */ -#define INIT_DBG_MODES "-all,test,print,disk" +#define INIT_DBG_MODES "-all,test,print" /* Below is a truly terrible poll-driven serial driver that we use for debugging * purposes - it outputs to COM1, but |