]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
refactor: migrate initrd to f_ops + fix remaining direct legacy accesses
authorTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 21:28:43 +0000 (18:28 -0300)
committerTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 21:28:43 +0000 (18:28 -0300)
- 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.

src/drivers/initrd.c
src/kernel/syscall.c

index bd9ecc5bcb0f7dd1165b0b2f8669bf347238e321..7ae0fff463eca4cd11d0b52c4d29f407fba3676e 100644 (file)
@@ -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;
+        }
     }
 }
 
index 45a630717224a3679fd8471ba302e63bce4abc64..60a3c22660b76c417a2928ceef42d3c908b7afdf 100644 (file)
@@ -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;