From: Tulio A M Mendes Date: Fri, 13 Feb 2026 21:28:43 +0000 (-0300) Subject: refactor: migrate initrd to f_ops + fix remaining direct legacy accesses X-Git-Url: https://projects.tadryanom.me/sitemap.xml?a=commitdiff_plain;h=bd5954a59133e0c75a81b78384f4844159c92d4b;p=AdrOS.git refactor: migrate initrd to f_ops + fix remaining direct legacy accesses - initrd.c: add initrd_file_ops/initrd_dir_ops, assign f_ops - syscall.c: replace all remaining direct legacy pointer accesses (truncate, finddir, read/write capability checks in open, read, pread, pwrite) with f_ops-aware dispatch 20/20 smoke tests pass. --- diff --git a/src/drivers/initrd.c b/src/drivers/initrd.c index bd9ecc5..7ae0fff 100644 --- a/src/drivers/initrd.c +++ b/src/drivers/initrd.c @@ -193,6 +193,14 @@ static struct fs_node* initrd_finddir(struct fs_node* node, const char* name) { return 0; } +static const struct file_operations initrd_file_ops = { + .read = initrd_read_impl, +}; + +static const struct file_operations initrd_dir_ops = { + .finddir = initrd_finddir, +}; + static void initrd_finalize_nodes(void) { for (int i = 0; i < entry_count; i++) { fs_node_t* n = &nodes[i]; @@ -203,11 +211,13 @@ static void initrd_finalize_nodes(void) { n->length = e->length; n->flags = e->flags; - n->read = (e->flags & FS_FILE) ? &initrd_read_impl : 0; - n->write = 0; - n->open = 0; - n->close = 0; - n->finddir = (e->flags & FS_DIRECTORY) ? &initrd_finddir : 0; + if (e->flags & FS_FILE) { + n->f_ops = &initrd_file_ops; + n->read = &initrd_read_impl; + } else if (e->flags & FS_DIRECTORY) { + n->f_ops = &initrd_dir_ops; + n->finddir = &initrd_finddir; + } } } diff --git a/src/kernel/syscall.c b/src/kernel/syscall.c index 45a6307..60a3c22 100644 --- a/src/kernel/syscall.c +++ b/src/kernel/syscall.c @@ -917,8 +917,11 @@ static int syscall_open_impl(const char* user_path, uint32_t flags) { return -ENOENT; } else if ((flags & 0x200U) != 0U && node->flags == FS_FILE) { /* O_TRUNC on existing file */ - if (node->truncate) { - node->truncate(node, 0); + if ((node->f_ops && node->f_ops->truncate) || node->truncate) { + if (node->f_ops && node->f_ops->truncate) + node->f_ops->truncate(node, 0); + else + node->truncate(node, 0); node->length = 0; } } @@ -1254,7 +1257,7 @@ static int syscall_read_impl(int fd, void* user_buf, uint32_t len) { return (int)total; } - if (!f->node->read) return -ESPIPE; + if (!(f->node->f_ops && f->node->f_ops->read) && !f->node->read) return -ESPIPE; uint8_t kbuf[256]; uint32_t total = 0; @@ -1694,9 +1697,13 @@ static int syscall_readlink_impl(const char* user_path, char* user_buf, uint32_t } fs_node_t* dir = vfs_lookup(parent); - if (!dir || !dir->finddir) return -ENOENT; + if (!dir) return -ENOENT; + fs_node_t* (*fn_finddir)(fs_node_t*, const char*) = NULL; + if (dir->f_ops && dir->f_ops->finddir) fn_finddir = dir->f_ops->finddir; + else if (dir->finddir) fn_finddir = dir->finddir; + if (!fn_finddir) return -ENOENT; - fs_node_t* node = dir->finddir(dir, leaf); + fs_node_t* node = fn_finddir(dir, leaf); if (!node) return -ENOENT; if (node->flags != FS_SYMLINK) return -EINVAL; @@ -2375,7 +2382,7 @@ static void posix_ext_syscall_dispatch(struct registers* regs, uint32_t syscall_ uint32_t offset = sc_arg3(regs); struct file* f = fd_get(fd); if (!f || !f->node) { sc_ret(regs) = (uint32_t)-EBADF; return; } - if (!f->node->read) { sc_ret(regs) = (uint32_t)-ESPIPE; return; } + if (!(f->node->f_ops && f->node->f_ops->read) && !f->node->read) { sc_ret(regs) = (uint32_t)-ESPIPE; return; } if (count > 1024 * 1024) { sc_ret(regs) = (uint32_t)-EINVAL; return; } uint8_t kbuf[256]; uint32_t total = 0; @@ -2401,7 +2408,7 @@ static void posix_ext_syscall_dispatch(struct registers* regs, uint32_t syscall_ uint32_t offset = sc_arg3(regs); struct file* f = fd_get(fd); if (!f || !f->node) { sc_ret(regs) = (uint32_t)-EBADF; return; } - if (!f->node->write) { sc_ret(regs) = (uint32_t)-ESPIPE; return; } + if (!(f->node->f_ops && f->node->f_ops->write) && !f->node->write) { sc_ret(regs) = (uint32_t)-ESPIPE; return; } if (count > 1024 * 1024) { sc_ret(regs) = (uint32_t)-EINVAL; return; } uint8_t kbuf[256]; uint32_t total = 0;