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 /kernel/fs | |
parent | a3e64ef2bf31dda9a94db011a96651de918ea968 (diff) |
fix refcount issue
Diffstat (limited to 'kernel/fs')
-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 |
4 files changed, 18 insertions, 20 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; } /* |