aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-04-25 04:04:20 +0000
committersotech117 <michael_foiani@brown.edu>2024-04-25 04:04:20 +0000
commit88db52baebd10ab1c2643f214ab9d44edcdb0851 (patch)
treef365ba758acd1bf164429cfbc02790e0ebbf8a79
parenta3e64ef2bf31dda9a94db011a96651de918ea968 (diff)
fix refcount issue
-rw-r--r--kernel/fs/namev.c2
-rw-r--r--kernel/fs/open.c4
-rw-r--r--kernel/fs/vfs_syscall.c30
-rw-r--r--kernel/fs/vnode_specials.c2
-rw-r--r--kernel/proc/proc.c28
-rw-r--r--kernel/util/debug.c2
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