diff options
author | Anton Kling <anton@kling.gg> | 2024-03-14 13:09:59 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-03-14 13:09:59 +0100 |
commit | 2e8b474d4219e7faaac3823e73c8d528c2698a37 (patch) | |
tree | 7d93b5fd220e8b703ba69f9b55122d15c9d619fb /kernel/fs | |
parent | 051ac9f1941e8bc6ad87beccb61a2d53111ba8ea (diff) |
random changes made
Diffstat (limited to 'kernel/fs')
-rw-r--r-- | kernel/fs/ext2.c | 4 | ||||
-rw-r--r-- | kernel/fs/fifo.c | 4 | ||||
-rw-r--r-- | kernel/fs/tmpfs.c | 8 | ||||
-rw-r--r-- | kernel/fs/vfs.c | 33 |
4 files changed, 27 insertions, 22 deletions
diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index ccf2fdf..9017b82 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -802,8 +802,8 @@ vfs_inode_t *ext2_mount(void) { cache = kcalloc(3000, sizeof(struct BLOCK_CACHE)); // TODO: Can this be done better? Maybe create a seperate function in // the VFS? - mount_fd = get_current_task()->file_descriptors[fd]; - get_current_task()->file_descriptors[fd] = NULL; + mount_fd = current_task->file_descriptors[fd]; + current_task->file_descriptors[fd] = NULL; parse_superblock(); return vfs_create_inode(0 /*inode_num*/, 0 /*type*/, 0 /*has_data*/, 0 /*can_write*/, 0 /*is_open*/, diff --git a/kernel/fs/fifo.c b/kernel/fs/fifo.c index 5563f76..7c286db 100644 --- a/kernel/fs/fifo.c +++ b/kernel/fs/fifo.c @@ -58,12 +58,12 @@ FIFO_FILE *create_fifo_object(void) { int create_fifo(void) { int fd_n = 0; - for (; get_current_task()->file_descriptors[fd_n]; fd_n++) + for (; current_task->file_descriptors[fd_n]; fd_n++) ; vfs_fd_t *fd = kmalloc(sizeof(vfs_fd_t)); fd->flags = O_RDWR | O_NONBLOCK; - get_current_task()->file_descriptors[fd_n] = fd; + current_task->file_descriptors[fd_n] = fd; fd->inode = kmalloc(sizeof(vfs_inode_t)); fd->inode->internal_object = (void *)create_fifo_object(); diff --git a/kernel/fs/tmpfs.c b/kernel/fs/tmpfs.c index bdb0dfb..75de1cd 100644 --- a/kernel/fs/tmpfs.c +++ b/kernel/fs/tmpfs.c @@ -56,8 +56,8 @@ void dual_pipe(int fd[2]) { fd[i] = vfs_create_fd(O_RDWR | O_NONBLOCK, 0, 0 /*is_tty*/, inode, &fd_ptr); assert(-1 != fd[i]); } - vfs_inode_t *f_inode = get_current_task()->file_descriptors[fd[0]]->inode; - vfs_inode_t *s_inode = get_current_task()->file_descriptors[fd[1]]->inode; + vfs_inode_t *f_inode = current_task->file_descriptors[fd[0]]->inode; + vfs_inode_t *s_inode = current_task->file_descriptors[fd[1]]->inode; tmp_inode *f_pipe = f_inode->internal_object; tmp_inode *s_pipe = s_inode->internal_object; f_pipe->read_inode = s_inode; @@ -86,8 +86,8 @@ void pipe(int fd[2]) { fd[i] = vfs_create_fd(O_RDWR, 0, 0 /*is_tty*/, inode, &fd_ptr); assert(-1 != fd[i]); } - vfs_inode_t *f_inode = get_current_task()->file_descriptors[fd[0]]->inode; - vfs_inode_t *s_inode = get_current_task()->file_descriptors[fd[1]]->inode; + vfs_inode_t *f_inode = current_task->file_descriptors[fd[0]]->inode; + vfs_inode_t *s_inode = current_task->file_descriptors[fd[1]]->inode; tmp_inode *f_pipe = f_inode->internal_object; tmp_inode *s_pipe = s_inode->internal_object; f_pipe->read_inode = s_inode; diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 2a072e9..76e6778 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -19,7 +19,7 @@ vfs_fd_t *get_vfs_fd(int fd) { dump_backtrace(12); return NULL; } - return get_current_task()->file_descriptors[fd]; + return current_task->file_descriptors[fd]; } vfs_inode_t *vfs_create_inode( @@ -56,7 +56,7 @@ vfs_inode_t *vfs_create_inode( int vfs_create_fd(int flags, int mode, int is_tty, vfs_inode_t *inode, vfs_fd_t **fd) { - process_t *p = (process_t *)get_current_task(); + process_t *p = (process_t *)current_task; int i; for (i = 0; i < 100; i++) { if (!p->file_descriptors[i]) { @@ -194,7 +194,7 @@ char *vfs_resolve_path(const char *file, char *resolved_path) { assert(vfs_clean_path(file, resolved_path)); return resolved_path; } - const char *cwd = get_current_task()->current_working_directory; + const char *cwd = current_task->current_working_directory; size_t l = strlen(cwd); assert(l > 0); assert('/' == cwd[l - 1]); @@ -230,10 +230,10 @@ int vfs_chdir(const char *path) { } vfs_close(tmp_fd); } - strcpy(get_current_task()->current_working_directory, resolved_path); + strcpy(current_task->current_working_directory, resolved_path); if ('/' != resolved_path[strlen(resolved_path)] && strlen(resolved_path) != 1) { - strcat(get_current_task()->current_working_directory, "/"); + strcat(current_task->current_working_directory, "/"); } return 0; } @@ -297,7 +297,7 @@ int vfs_close(int fd) { assert(0 < fd_ptr->reference_count); // Remove process reference fd_ptr->reference_count--; - get_current_task()->file_descriptors[fd] = 0; + current_task->file_descriptors[fd] = 0; // If no references left then free the contents if (0 == fd_ptr->reference_count) { if (fd_ptr->inode->close) { @@ -326,7 +326,7 @@ int vfs_pread(int fd, void *buf, u64 count, u64 offset) { kprintf("EBADF : %x\n", fd); return -EBADF; } - vfs_fd_t *vfs_fd = get_current_task()->file_descriptors[fd]; + vfs_fd_t *vfs_fd = current_task->file_descriptors[fd]; if (!vfs_fd) { return -EBADF; } @@ -334,10 +334,15 @@ int vfs_pread(int fd, void *buf, u64 count, u64 offset) { if (-EAGAIN == rc && count > 0) { if (!(vfs_fd->flags & O_NONBLOCK)) { struct pollfd fds; - fds.fd = fd; - fds.events = POLLIN; - fds.revents = 0; - poll(&fds, 1, 0); + do { + fds.fd = fd; + fds.events = POLLIN; + fds.revents = 0; + int rc = poll(&fds, 1, 0); + if (-EINTR == rc) { + return -EINTR; + } + } while (!(fds.revents & POLLIN)); return vfs_pread(fd, buf, count, offset); } } @@ -372,9 +377,9 @@ vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset) { } int vfs_dup2(int org_fd, int new_fd) { - get_current_task()->file_descriptors[new_fd] = - get_current_task()->file_descriptors[org_fd]; - get_current_task()->file_descriptors[new_fd]->reference_count++; + current_task->file_descriptors[new_fd] = + current_task->file_descriptors[org_fd]; + current_task->file_descriptors[new_fd]->reference_count++; return 1; } |