summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-03-14 13:09:59 +0100
committerAnton Kling <anton@kling.gg>2024-03-14 13:09:59 +0100
commit2e8b474d4219e7faaac3823e73c8d528c2698a37 (patch)
tree7d93b5fd220e8b703ba69f9b55122d15c9d619fb /kernel/fs
parent051ac9f1941e8bc6ad87beccb61a2d53111ba8ea (diff)
random changes made
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/ext2.c4
-rw-r--r--kernel/fs/fifo.c4
-rw-r--r--kernel/fs/tmpfs.c8
-rw-r--r--kernel/fs/vfs.c33
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;
}