summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-01 15:29:21 +0200
committerAnton Kling <anton@kling.gg>2024-07-01 15:29:21 +0200
commitc72057ac71d5f7b4ec7175e888828053bed7e4db (patch)
tree00aa37e9364d8ed9a34d8289bb1dc27607260865 /kernel/fs
parente9be93974b24733f20502ce64c54b5ec749a0a3a (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.c12
-rw-r--r--kernel/fs/tmpfs.c4
-rw-r--r--kernel/fs/vfs.c12
-rw-r--r--kernel/fs/vfs.h1
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;