diff options
author | Anton Kling <anton@kling.gg> | 2024-07-01 15:29:21 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-07-01 15:29:21 +0200 |
commit | c72057ac71d5f7b4ec7175e888828053bed7e4db (patch) | |
tree | 00aa37e9364d8ed9a34d8289bb1dc27607260865 /kernel/fs | |
parent | e9be93974b24733f20502ce64c54b5ec749a0a3a (diff) |
VFS: Move towards unifying vfs_inode_t and vfs_fd_t
There is no need for these to be seperate. They will probably move to
the same struct soon.
Diffstat (limited to 'kernel/fs')
-rw-r--r-- | kernel/fs/devfs.c | 12 | ||||
-rw-r--r-- | kernel/fs/tmpfs.c | 4 | ||||
-rw-r--r-- | kernel/fs/vfs.c | 12 | ||||
-rw-r--r-- | kernel/fs/vfs.h | 1 |
4 files changed, 11 insertions, 18 deletions
diff --git a/kernel/fs/devfs.c b/kernel/fs/devfs.c index 8139448..833aab5 100644 --- a/kernel/fs/devfs.c +++ b/kernel/fs/devfs.c @@ -26,7 +26,6 @@ vfs_inode_t *devfs_add_file( i->_has_data = has_data; i->_can_write = can_write; i->is_open = 1; - i->ref = 1; num_files++; return i; } @@ -34,11 +33,17 @@ vfs_inode_t *devfs_add_file( vfs_inode_t *devfs_open(const char *file) { for (int i = 0; i < num_files; i++) { if (isequal_n(files[i].name, file, strlen(files[i].name))) { - return files[i].inode; + // FIXME: Temporary hack + vfs_inode_t *r = kmalloc(sizeof(vfs_inode_t)); + if (!r) { + return NULL; // TODO: Give some error condition + } + memcpy(r, files[i].inode, sizeof(vfs_inode_t)); + return r; } } - return 0; + return NULL; } int devfs_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) { @@ -97,7 +102,6 @@ void add_stdout(void) { vfs_inode_t *devfs_mount(void) { vfs_inode_t *root = kcalloc(1, sizeof(vfs_inode_t)); - root->ref++; root->open = devfs_open; root->read = devfs_read; root->write = devfs_write; diff --git a/kernel/fs/tmpfs.c b/kernel/fs/tmpfs.c index 8269364..5adf8de 100644 --- a/kernel/fs/tmpfs.c +++ b/kernel/fs/tmpfs.c @@ -66,9 +66,7 @@ void dual_pipe(int fd[2]) { tmp_inode *f_pipe = f_inode->internal_object; tmp_inode *s_pipe = s_inode->internal_object; f_pipe->read_inode = s_inode; - s_inode->ref++; s_pipe->read_inode = f_inode; - f_inode->ref++; f_pipe->is_closed = 0; s_pipe->is_closed = 0; } @@ -98,9 +96,7 @@ void pipe(int fd[2]) { tmp_inode *f_pipe = f_inode->internal_object; tmp_inode *s_pipe = s_inode->internal_object; f_pipe->read_inode = s_inode; - s_inode->ref++; s_pipe->read_inode = f_inode; - f_inode->ref++; f_pipe->is_closed = 0; s_pipe->is_closed = 0; } diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 5bbca8e..03352c4 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -58,14 +58,12 @@ vfs_inode_t *vfs_create_inode( r->truncate = truncate; r->stat = stat; r->send_signal = send_signal; - r->ref = 0; r->connect = connect; return r; } int vfs_create_fd(int flags, int mode, int is_tty, vfs_inode_t *inode, vfs_fd_t **fd) { - inode->ref++; vfs_fd_t *r = kmalloc(sizeof(vfs_fd_t)); r->flags = flags; r->mode = mode; @@ -301,14 +299,10 @@ int vfs_close_process(process_t *p, int fd) { assert(relist_remove(&p->file_descriptors, fd)); // If no references left then free the contents if (0 == fd_ptr->reference_count) { - assert(0 < fd_ptr->inode->ref); - fd_ptr->inode->ref--; - if (0 >= fd_ptr->inode->ref) { - if (fd_ptr->inode->close) { - fd_ptr->inode->close(fd_ptr); - } - kfree(fd_ptr->inode); + if (fd_ptr->inode->close) { + fd_ptr->inode->close(fd_ptr); } + kfree(fd_ptr->inode); kfree(fd_ptr); } return 0; diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 080a663..3bb7f74 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -46,7 +46,6 @@ struct vfs_fd { struct vfs_inode { int inode_num; int type; - int ref; int (*_has_data)(vfs_inode_t *iinode); int (*_can_write)(vfs_inode_t *iinode); u8 is_open; |