diff options
author | Anton Kling <anton@kling.gg> | 2024-04-27 15:26:39 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-27 15:26:39 +0200 |
commit | 02c27583a539c4e8073509536d328581cf1ba346 (patch) | |
tree | 67c8de59e04b118116f039e724be3ee9268b507f /kernel/fs | |
parent | 7ab3153f92f38223157c4c1f4af1c30e33c94a76 (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.c | 2 | ||||
-rw-r--r-- | kernel/fs/vfs.c | 10 |
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(¤t_task->file_descriptors, fd, NULL); + relist_remove(¤t_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(¤t_task->file_descriptors, r, &index); + relist_add(¤t_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(¤t_task->file_descriptors, org_fd, (void **)&orig)) { + if (!relist_get(¤t_task->file_descriptors, org_fd, (void **)&orig)) { assert(0); return -1; } assert(1 <= orig->reference_count); - if (!list_set(¤t_task->file_descriptors, new_fd, orig)) { + if (!relist_set(¤t_task->file_descriptors, new_fd, orig)) { assert(0); return -1; } |