summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-27 15:26:39 +0200
committerAnton Kling <anton@kling.gg>2024-04-27 15:26:39 +0200
commit02c27583a539c4e8073509536d328581cf1ba346 (patch)
tree67c8de59e04b118116f039e724be3ee9268b507f /kernel/fs
parent7ab3153f92f38223157c4c1f4af1c30e33c94a76 (diff)
Kernel: Make file descriptor numbers reusable.
Instead of using the "append only" list it now uses "relist" which allows for indexes to be removed.
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/ext2.c2
-rw-r--r--kernel/fs/vfs.c10
2 files changed, 6 insertions, 6 deletions
diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c
index db947c0..613cf53 100644
--- a/kernel/fs/ext2.c
+++ b/kernel/fs/ext2.c
@@ -814,7 +814,7 @@ vfs_inode_t *ext2_mount(void) {
mount_fd = get_vfs_fd(fd, NULL);
// Remove the FD from the current task
// FIXME: This is a hacky solution
- list_set(&current_task->file_descriptors, fd, NULL);
+ relist_remove(&current_task->file_descriptors, fd);
parse_superblock();
return vfs_create_inode(
0 /*inode_num*/, 0 /*type*/, 0 /*has_data*/, 0 /*can_write*/,
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index 63db938..16f9186 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -18,7 +18,7 @@ vfs_fd_t *get_vfs_fd(int fd, process_t *p) {
}
vfs_fd_t *r;
- if (!list_get(&p->file_descriptors, fd, (void **)&r)) {
+ if (!relist_get(&p->file_descriptors, fd, (void **)&r)) {
return NULL;
}
return r;
@@ -73,7 +73,7 @@ int vfs_create_fd(int flags, int mode, int is_tty, vfs_inode_t *inode,
*fd = r;
}
int index;
- list_add(&current_task->file_descriptors, r, &index);
+ relist_add(&current_task->file_descriptors, r, &index);
return index;
}
@@ -294,7 +294,7 @@ int vfs_close_process(process_t *p, int fd) {
assert(0 < fd_ptr->reference_count);
// Remove process reference
fd_ptr->reference_count--;
- list_set(&p->file_descriptors, fd, NULL);
+ assert(relist_remove(&p->file_descriptors, fd));
// If no references left then free the contents
if (0 == fd_ptr->reference_count) {
if (fd_ptr->inode->close) {
@@ -411,12 +411,12 @@ vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset) {
int vfs_dup2(int org_fd, int new_fd) {
vfs_fd_t *orig;
- if (!list_get(&current_task->file_descriptors, org_fd, (void **)&orig)) {
+ if (!relist_get(&current_task->file_descriptors, org_fd, (void **)&orig)) {
assert(0);
return -1;
}
assert(1 <= orig->reference_count);
- if (!list_set(&current_task->file_descriptors, new_fd, orig)) {
+ if (!relist_set(&current_task->file_descriptors, new_fd, orig)) {
assert(0);
return -1;
}