aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs/vfs_syscall.c
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 /kernel/fs/vfs_syscall.c
parenta3e64ef2bf31dda9a94db011a96651de918ea968 (diff)
fix refcount issue
Diffstat (limited to 'kernel/fs/vfs_syscall.c')
-rw-r--r--kernel/fs/vfs_syscall.c30
1 files changed, 16 insertions, 14 deletions
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;
}