diff options
Diffstat (limited to 'kernel/fs/vfs_syscall.c')
-rw-r--r-- | kernel/fs/vfs_syscall.c | 30 |
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; } |