]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
refactor: remove legacy per-node function pointers from fs_node_t
authorTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 22:27:06 +0000 (19:27 -0300)
committerTulio A M Mendes <[email protected]>
Fri, 13 Feb 2026 22:27:06 +0000 (19:27 -0300)
Phase B3b complete — all VFS dispatch now goes exclusively through
the f_ops pointer. Changes:

- fs.h: removed 16 legacy function pointer fields from fs_node_t
  (read, write, open, close, finddir, readdir, ioctl, mmap, poll,
  create, mkdir, unlink, rmdir, rename, truncate, link)
  fs_node_t shrinks by 64 bytes (16 pointers × 4 bytes)

- fs.c: removed all legacy fallback paths from VFS wrappers
- syscall.c: removed legacy fallbacks for poll, readdir, ioctl,
  mmap, truncate, finddir, and read/write capability checks
- overlayfs.c: removed legacy fallbacks in finddir/readdir dispatch
- kconsole.c: switched to f_ops-based readdir dispatch

- Removed all dual-assignment lines from:
  ext2.c, fat.c, diskfs.c, tmpfs.c, devfs.c, overlayfs.c,
  procfs.c, persistfs.c, pty.c, tty.c, keyboard.c, vbe.c,
  initrd.c, syscall.c (pipe + socket nodes)

- Removed ext2_set_dir_ops, fat_set_dir_ops, diskfs_set_dir_ops
  helper functions (no longer needed)

20/20 smoke tests pass.

17 files changed:
include/fs.h
src/drivers/initrd.c
src/drivers/keyboard.c
src/drivers/vbe.c
src/kernel/devfs.c
src/kernel/diskfs.c
src/kernel/ext2.c
src/kernel/fat.c
src/kernel/fs.c
src/kernel/kconsole.c
src/kernel/overlayfs.c
src/kernel/persistfs.c
src/kernel/procfs.c
src/kernel/pty.c
src/kernel/syscall.c
src/kernel/tmpfs.c
src/kernel/tty.c

index 8b6456b2f3a4c350503797c4a61c7e6670f288b4..a3ecf4b891e40aa8456a09a1915343e779ed95ba 100644 (file)
@@ -54,25 +54,6 @@ typedef struct fs_node {
     char symlink_target[128];
 
     const struct file_operations* f_ops;
-
-    // Legacy per-node function pointers (will be removed after migration)
-    uint32_t (*read)(struct fs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
-    uint32_t (*write)(struct fs_node* node, uint32_t offset, uint32_t size, const uint8_t* buffer);
-    void (*open)(struct fs_node* node);
-    void (*close)(struct fs_node* node);
-    struct fs_node* (*finddir)(struct fs_node* node, const char* name);
-    int (*readdir)(struct fs_node* node, uint32_t* inout_index, void* buf, uint32_t buf_len);
-    int (*ioctl)(struct fs_node* node, uint32_t cmd, void* arg);
-    uintptr_t (*mmap)(struct fs_node* node, uintptr_t addr, uint32_t length, uint32_t prot, uint32_t offset);
-    int (*poll)(struct fs_node* node, int events);
-    int (*create)(struct fs_node* dir, const char* name, uint32_t flags, struct fs_node** out);
-    int (*mkdir)(struct fs_node* dir, const char* name);
-    int (*unlink)(struct fs_node* dir, const char* name);
-    int (*rmdir)(struct fs_node* dir, const char* name);
-    int (*rename)(struct fs_node* old_dir, const char* old_name,
-                  struct fs_node* new_dir, const char* new_name);
-    int (*truncate)(struct fs_node* node, uint32_t length);
-    int (*link)(struct fs_node* dir, const char* name, struct fs_node* target);
 } fs_node_t;
 
 struct vfs_dirent {
index 7ae0fff463eca4cd11d0b52c4d29f407fba3676e..b3a7fd7bac3cb45ff69be49fc5053597e97a9e45 100644 (file)
@@ -213,10 +213,8 @@ static void initrd_finalize_nodes(void) {
 
         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 f3fd89b02aab73d5b094acab818bcff273f116cc..b36fac677d90ebd9205be9896c670e20e30ce783 100644 (file)
@@ -123,8 +123,6 @@ void keyboard_register_devfs(void) {
     g_dev_kbd_node.flags = FS_CHARDEVICE;
     g_dev_kbd_node.inode = 21;
     g_dev_kbd_node.f_ops = &kbd_fops;
-    g_dev_kbd_node.read = &kbd_dev_read;
-    g_dev_kbd_node.poll = &kbd_dev_poll;
     devfs_register_device(&g_dev_kbd_node);
 }
 
index dbbb81df8e6f69f30b44930b08618aa28aebda27..4c4ebf7b686279dafaec5f60adf97a4df2c93fdf 100644 (file)
@@ -193,10 +193,6 @@ void vbe_register_devfs(void) {
     g_dev_fb0_node.inode = 20;
     g_dev_fb0_node.length = g_vbe.size;
     g_dev_fb0_node.f_ops = &fb0_fops;
-    g_dev_fb0_node.read = &fb0_read;
-    g_dev_fb0_node.write = &fb0_write;
-    g_dev_fb0_node.ioctl = &fb0_ioctl;
-    g_dev_fb0_node.mmap = &fb0_mmap;
     devfs_register_device(&g_dev_fb0_node);
 
     kprintf("[VBE] Registered /dev/fb0\n");
index 38d51e5238ac57c3934de9fd8d2bb1966e5aa340..5af07b2fdbe23a11daf41249016bc332467903c7 100644 (file)
@@ -224,44 +224,30 @@ static void devfs_init_once(void) {
     g_dev_root.vfs.inode = 1;
     g_dev_root.vfs.length = 0;
     g_dev_root.vfs.f_ops = &devfs_dir_ops;
-    g_dev_root.vfs.finddir = devfs_finddir_impl;
-    g_dev_root.vfs.readdir = devfs_readdir_impl;
 
     memset(&g_dev_null, 0, sizeof(g_dev_null));
     strcpy(g_dev_null.name, "null");
     g_dev_null.flags = FS_CHARDEVICE;
     g_dev_null.inode = 2;
     g_dev_null.f_ops = &dev_null_ops;
-    g_dev_null.read = dev_null_read;
-    g_dev_null.write = dev_null_write;
-    g_dev_null.poll = dev_null_poll;
 
     memset(&g_dev_zero, 0, sizeof(g_dev_zero));
     strcpy(g_dev_zero.name, "zero");
     g_dev_zero.flags = FS_CHARDEVICE;
     g_dev_zero.inode = 7;
     g_dev_zero.f_ops = &dev_zero_ops;
-    g_dev_zero.read = dev_zero_read;
-    g_dev_zero.write = dev_zero_write;
-    g_dev_zero.poll = dev_always_ready_poll;
 
     memset(&g_dev_random, 0, sizeof(g_dev_random));
     strcpy(g_dev_random.name, "random");
     g_dev_random.flags = FS_CHARDEVICE;
     g_dev_random.inode = 8;
     g_dev_random.f_ops = &dev_random_ops;
-    g_dev_random.read = dev_random_read;
-    g_dev_random.write = dev_random_write;
-    g_dev_random.poll = dev_always_ready_poll;
 
     memset(&g_dev_urandom, 0, sizeof(g_dev_urandom));
     strcpy(g_dev_urandom.name, "urandom");
     g_dev_urandom.flags = FS_CHARDEVICE;
     g_dev_urandom.inode = 9;
     g_dev_urandom.f_ops = &dev_random_ops;
-    g_dev_urandom.read = dev_random_read;
-    g_dev_urandom.write = dev_random_write;
-    g_dev_urandom.poll = dev_always_ready_poll;
 }
 
 fs_node_t* devfs_create_root(void) {
index fede86be0c9da29eb38f3f4cfa836a0f84dd4688..f0a5ea08db07d887748aa2b30fcac6bd4270e743 100644 (file)
@@ -459,7 +459,6 @@ static int diskfs_readdir_impl(struct fs_node* node, uint32_t* inout_index, void
     return (int)(nents * (uint32_t)sizeof(struct vfs_dirent));
 }
 
-static void diskfs_set_dir_ops(fs_node_t* vfs);
 static int diskfs_vfs_truncate(struct fs_node* node, uint32_t length);
 static struct fs_node* diskfs_root_finddir(struct fs_node* node, const char* name);
 static int diskfs_vfs_create(struct fs_node* dir, const char* name, uint32_t flags, struct fs_node** out);
@@ -512,24 +511,16 @@ static struct fs_node* diskfs_root_finddir(struct fs_node* node, const char* nam
 
     strcpy(dn->vfs.name, name);
     dn->vfs.inode = 100 + (uint32_t)cino;
-    dn->vfs.open = 0;
-    dn->vfs.close = &diskfs_close_impl;
     dn->ino = cino;
 
     if (sb.inodes[cino].type == DISKFS_INODE_DIR) {
         dn->vfs.flags = FS_DIRECTORY;
         dn->vfs.length = 0;
         dn->vfs.f_ops = &diskfs_dir_fops;
-        dn->vfs.finddir = &diskfs_root_finddir;
-        dn->vfs.readdir = &diskfs_readdir_impl;
-        diskfs_set_dir_ops(&dn->vfs);
     } else {
         dn->vfs.flags = FS_FILE;
         dn->vfs.length = sb.inodes[cino].size_bytes;
         dn->vfs.f_ops = &diskfs_file_fops;
-        dn->vfs.read = &diskfs_read_impl;
-        dn->vfs.write = &diskfs_write_impl;
-        dn->vfs.truncate = &diskfs_vfs_truncate;
     }
 
     return &dn->vfs;
@@ -584,9 +575,6 @@ int diskfs_open_file(const char* rel_path, uint32_t flags, fs_node_t** out_node)
     dn->vfs.inode = 100 + (uint32_t)ino;
     dn->vfs.length = sb.inodes[ino].size_bytes;
     dn->vfs.f_ops = &diskfs_file_fops;
-    dn->vfs.read = &diskfs_read_impl;
-    dn->vfs.write = &diskfs_write_impl;
-    dn->vfs.close = &diskfs_close_impl;
     dn->ino = ino;
 
     *out_node = &dn->vfs;
@@ -871,9 +859,7 @@ static int diskfs_vfs_create(struct fs_node* dir, const char* name, uint32_t fla
         dn->vfs.flags = FS_FILE;
         dn->vfs.inode = 100 + (uint32_t)ino;
         dn->vfs.length = sb.inodes[ino].size_bytes;
-        dn->vfs.read = &diskfs_read_impl;
-        dn->vfs.write = &diskfs_write_impl;
-        dn->vfs.close = &diskfs_close_impl;
+        dn->vfs.f_ops = &diskfs_file_fops;
         dn->ino = ino;
         *out = &dn->vfs;
         return 0;
@@ -894,9 +880,7 @@ static int diskfs_vfs_create(struct fs_node* dir, const char* name, uint32_t fla
     dn->vfs.flags = FS_FILE;
     dn->vfs.inode = 100 + (uint32_t)new_ino;
     dn->vfs.length = 0;
-    dn->vfs.read = &diskfs_read_impl;
-    dn->vfs.write = &diskfs_write_impl;
-    dn->vfs.close = &diskfs_close_impl;
+    dn->vfs.f_ops = &diskfs_file_fops;
     dn->ino = new_ino;
     *out = &dn->vfs;
     return 0;
@@ -1069,16 +1053,6 @@ static int diskfs_vfs_link(struct fs_node* dir, const char* name, struct fs_node
     return diskfs_super_store(&sb);
 }
 
-static void diskfs_set_dir_ops(fs_node_t* vfs) {
-    if (!vfs) return;
-    vfs->create = &diskfs_vfs_create;
-    vfs->mkdir = &diskfs_vfs_mkdir;
-    vfs->unlink = &diskfs_vfs_unlink;
-    vfs->rmdir = &diskfs_vfs_rmdir;
-    vfs->rename = &diskfs_vfs_rename;
-    vfs->link = &diskfs_vfs_link;
-}
-
 fs_node_t* diskfs_create_root(int drive) {
     if (!g_ready) {
         g_diskfs_drive = drive;
@@ -1094,9 +1068,6 @@ fs_node_t* diskfs_create_root(int drive) {
         g_root.vfs.inode = 100;
         g_root.vfs.length = 0;
         g_root.vfs.f_ops = &diskfs_dir_fops;
-        g_root.vfs.finddir = &diskfs_root_finddir;
-        g_root.vfs.readdir = &diskfs_readdir_impl;
-        diskfs_set_dir_ops(&g_root.vfs);
         g_root.ino = 0;
 
         if (g_ready) {
index dea111ac721bcb6753cbdac276f13f4d29b642cb..abb406e13e84411c87af53f5b7a460440a69fa78 100644 (file)
@@ -557,18 +557,6 @@ static void ext2_close_impl(fs_node_t* node) {
     kfree(en);
 }
 
-static void ext2_set_dir_ops(fs_node_t* vfs) {
-    if (!vfs) return;
-    vfs->finddir = &ext2_finddir;
-    vfs->readdir = &ext2_readdir_impl;
-    vfs->create = &ext2_create_impl;
-    vfs->mkdir = &ext2_mkdir_impl;
-    vfs->unlink = &ext2_unlink_impl;
-    vfs->rmdir = &ext2_rmdir_impl;
-    vfs->rename = &ext2_rename_impl;
-    vfs->link = &ext2_link_impl;
-}
-
 static struct ext2_node* ext2_make_node(uint32_t ino, const struct ext2_inode* inode, const char* name) {
     struct ext2_node* en = (struct ext2_node*)kmalloc(sizeof(struct ext2_node));
     if (!en) return NULL;
@@ -584,13 +572,11 @@ static struct ext2_node* ext2_make_node(uint32_t ino, const struct ext2_inode* i
     en->vfs.uid = inode->i_uid;
     en->vfs.gid = inode->i_gid;
     en->vfs.mode = inode->i_mode;
-    en->vfs.close = &ext2_close_impl;
 
     if ((inode->i_mode & 0xF000) == EXT2_S_IFDIR) {
         en->vfs.flags = FS_DIRECTORY;
         en->vfs.length = inode->i_size;
         en->vfs.f_ops = &ext2_dir_fops;
-        ext2_set_dir_ops(&en->vfs);
     } else if ((inode->i_mode & 0xF000) == EXT2_S_IFLNK) {
         en->vfs.flags = FS_SYMLINK;
         en->vfs.length = inode->i_size;
@@ -603,9 +589,6 @@ static struct ext2_node* ext2_make_node(uint32_t ino, const struct ext2_inode* i
         en->vfs.flags = FS_FILE;
         en->vfs.length = inode->i_size;
         en->vfs.f_ops = &ext2_file_fops;
-        en->vfs.read = &ext2_file_read;
-        en->vfs.write = &ext2_file_write;
-        en->vfs.truncate = &ext2_truncate_impl;
     }
 
     return en;
@@ -1427,7 +1410,7 @@ fs_node_t* ext2_mount(int drive, uint32_t partition_lba) {
     g_ext2_root.vfs.gid = root_inode.i_gid;
     g_ext2_root.vfs.mode = root_inode.i_mode;
     g_ext2_root.ino = EXT2_ROOT_INO;
-    ext2_set_dir_ops(&g_ext2_root.vfs);
+    g_ext2_root.vfs.f_ops = &ext2_dir_fops;
 
     g_ext2_ready = 1;
 
index e7fa6b3ce60859d51b99b4323807f39f5cb3dd98..78641283cd66c0fca0ddd7c576c181e88bece5b9 100644 (file)
@@ -507,17 +507,6 @@ static void fat_close_impl(fs_node_t* node) {
     kfree(fn);
 }
 
-static void fat_set_dir_ops(fs_node_t* vfs) {
-    if (!vfs) return;
-    vfs->finddir = &fat_finddir;
-    vfs->readdir = &fat_readdir_impl;
-    vfs->create = &fat_create_impl;
-    vfs->mkdir = &fat_mkdir_impl;
-    vfs->unlink = &fat_unlink_impl;
-    vfs->rmdir = &fat_rmdir_impl;
-    vfs->rename = &fat_rename_impl;
-}
-
 static struct fat_node* fat_make_node(const struct fat_dirent* de, uint32_t parent_cluster, uint32_t dirent_offset) {
     struct fat_node* fn = (struct fat_node*)kmalloc(sizeof(struct fat_node));
     if (!fn) return NULL;
@@ -533,17 +522,12 @@ static struct fat_node* fat_make_node(const struct fat_dirent* de, uint32_t pare
         fn->vfs.length = 0;
         fn->vfs.inode = fn->first_cluster;
         fn->vfs.f_ops = &fat_dir_fops;
-        fat_set_dir_ops(&fn->vfs);
     } else {
         fn->vfs.flags = FS_FILE;
         fn->vfs.length = de->file_size;
         fn->vfs.inode = fn->first_cluster;
         fn->vfs.f_ops = &fat_file_fops;
-        fn->vfs.read = &fat_file_read;
-        fn->vfs.write = &fat_file_write;
-        fn->vfs.truncate = &fat_truncate_impl;
     }
-    fn->vfs.close = &fat_close_impl;
 
     return fn;
 }
@@ -1179,7 +1163,7 @@ fs_node_t* fat_mount(int drive, uint32_t partition_lba) {
     g_fat_root.first_cluster = (g_fat.type == FAT_TYPE_32) ? g_fat.root_cluster : 0;
     g_fat_root.parent_cluster = 0;
     g_fat_root.dir_entry_offset = 0;
-    fat_set_dir_ops(&g_fat_root.vfs);
+    g_fat_root.vfs.f_ops = &fat_dir_fops;
 
     g_fat_ready = 1;
 
index aa2f15e5a13c899d3d693dff976380088d1fa992..c42cd24b98cc68ade20be1d7375b6b55c377269a 100644 (file)
@@ -72,31 +72,23 @@ int vfs_mount(const char* mountpoint, fs_node_t* root) {
 uint32_t vfs_read(fs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buffer) {
     if (node->f_ops && node->f_ops->read)
         return node->f_ops->read(node, offset, size, buffer);
-    if (node->read)
-        return node->read(node, offset, size, buffer);
     return 0;
 }
 
 uint32_t vfs_write(fs_node_t* node, uint32_t offset, uint32_t size, const uint8_t* buffer) {
     if (node->f_ops && node->f_ops->write)
         return node->f_ops->write(node, offset, size, buffer);
-    if (node->write)
-        return node->write(node, offset, size, buffer);
     return 0;
 }
 
 void vfs_open(fs_node_t* node) {
     if (node->f_ops && node->f_ops->open)
         node->f_ops->open(node);
-    else if (node->open)
-        node->open(node);
 }
 
 void vfs_close(fs_node_t* node) {
     if (node->f_ops && node->f_ops->close)
         node->f_ops->close(node);
-    else if (node->close)
-        node->close(node);
 }
 
 static fs_node_t* vfs_lookup_depth(const char* path, int depth);
@@ -152,7 +144,6 @@ static fs_node_t* vfs_lookup_depth(const char* path, int depth) {
         if (!cur) return NULL;
         fs_node_t* (*fn_finddir)(fs_node_t*, const char*) = NULL;
         if (cur->f_ops && cur->f_ops->finddir) fn_finddir = cur->f_ops->finddir;
-        else if (cur->finddir) fn_finddir = cur->finddir;
         if (!fn_finddir) return NULL;
         cur = fn_finddir(cur, part);
         if (!cur) return NULL;
@@ -206,8 +197,7 @@ int vfs_create(const char* path, uint32_t flags, fs_node_t** out) {
     if (parent->flags != FS_DIRECTORY) return -ENOTDIR;
     if (parent->f_ops && parent->f_ops->create)
         return parent->f_ops->create(parent, name, flags, out);
-    if (!parent->create) return -ENOSYS;
-    return parent->create(parent, name, flags, out);
+    return -ENOSYS;
 }
 
 int vfs_mkdir(const char* path) {
@@ -218,8 +208,7 @@ int vfs_mkdir(const char* path) {
     if (parent->flags != FS_DIRECTORY) return -ENOTDIR;
     if (parent->f_ops && parent->f_ops->mkdir)
         return parent->f_ops->mkdir(parent, name);
-    if (!parent->mkdir) return -ENOSYS;
-    return parent->mkdir(parent, name);
+    return -ENOSYS;
 }
 
 int vfs_unlink(const char* path) {
@@ -230,8 +219,7 @@ int vfs_unlink(const char* path) {
     if (parent->flags != FS_DIRECTORY) return -ENOTDIR;
     if (parent->f_ops && parent->f_ops->unlink)
         return parent->f_ops->unlink(parent, name);
-    if (!parent->unlink) return -ENOSYS;
-    return parent->unlink(parent, name);
+    return -ENOSYS;
 }
 
 int vfs_rmdir(const char* path) {
@@ -242,8 +230,7 @@ int vfs_rmdir(const char* path) {
     if (parent->flags != FS_DIRECTORY) return -ENOTDIR;
     if (parent->f_ops && parent->f_ops->rmdir)
         return parent->f_ops->rmdir(parent, name);
-    if (!parent->rmdir) return -ENOSYS;
-    return parent->rmdir(parent, name);
+    return -ENOSYS;
 }
 
 int vfs_rename(const char* old_path, const char* new_path) {
@@ -254,8 +241,7 @@ int vfs_rename(const char* old_path, const char* new_path) {
     if (!old_parent || !new_parent) return -ENOENT;
     if (old_parent->f_ops && old_parent->f_ops->rename)
         return old_parent->f_ops->rename(old_parent, old_name, new_parent, new_name);
-    if (!old_parent->rename) return -ENOSYS;
-    return old_parent->rename(old_parent, old_name, new_parent, new_name);
+    return -ENOSYS;
 }
 
 int vfs_truncate(const char* path, uint32_t length) {
@@ -265,8 +251,7 @@ int vfs_truncate(const char* path, uint32_t length) {
     if (node->flags != FS_FILE) return -EISDIR;
     if (node->f_ops && node->f_ops->truncate)
         return node->f_ops->truncate(node, length);
-    if (!node->truncate) return -ENOSYS;
-    return node->truncate(node, length);
+    return -ENOSYS;
 }
 
 int vfs_link(const char* old_path, const char* new_path) {
@@ -281,6 +266,5 @@ int vfs_link(const char* old_path, const char* new_path) {
     if (parent->flags != FS_DIRECTORY) return -ENOTDIR;
     if (parent->f_ops && parent->f_ops->link)
         return parent->f_ops->link(parent, name, target);
-    if (!parent->link) return -ENOSYS;
-    return parent->link(parent, name, target);
+    return -ENOSYS;
 }
index 16c3104612a33339f6be268ef52e4a54a31a51c0..51043891b0f3bbf8b746525bd0d663ad60b54708 100644 (file)
@@ -267,7 +267,9 @@ static void kconsole_ls(const char* path) {
         return;
     }
 
-    if (!dir->readdir) {
+    int (*fn_readdir)(struct fs_node*, uint32_t*, void*, uint32_t) = NULL;
+    if (dir->f_ops && dir->f_ops->readdir) fn_readdir = dir->f_ops->readdir;
+    if (!fn_readdir) {
         kprintf("ls: not a directory\n");
         return;
     }
@@ -275,7 +277,7 @@ static void kconsole_ls(const char* path) {
     uint32_t idx = 0;
     struct vfs_dirent ent;
     while (1) {
-        int rc = dir->readdir(dir, &idx, &ent, sizeof(ent));
+        int rc = fn_readdir(dir, &idx, &ent, sizeof(ent));
         if (rc != 0) break;
         kprintf("  %s\n", ent.d_name);
     }
index d10f03795207aece0a015767d50ee92764527ace..9abde00252519f9db6b025b3aea78191c96f11e5 100644 (file)
@@ -126,10 +126,6 @@ static fs_node_t* overlay_wrap_child(struct overlay_node* parent, const char* na
     } else {
         c->vfs.f_ops = &overlay_file_ops;
     }
-    c->vfs.read = &overlay_read_impl;
-    c->vfs.write = (c->vfs.flags == FS_FILE) ? &overlay_write_impl : 0;
-    c->vfs.finddir = (c->vfs.flags == FS_DIRECTORY) ? &overlay_finddir_impl : 0;
-    c->vfs.readdir = (c->vfs.flags == FS_DIRECTORY) ? &overlay_readdir_impl : 0;
 
     if (parent->path[0] == 0) {
         c->path[0] = '/';
@@ -170,8 +166,6 @@ static int overlay_readdir_impl(struct fs_node* node, uint32_t* inout_index, voi
     if (!src) return 0;
     if (src->f_ops && src->f_ops->readdir)
         return src->f_ops->readdir(src, inout_index, buf, buf_len);
-    if (src->readdir)
-        return src->readdir(src, inout_index, buf, buf_len);
     return 0;
 }
 
@@ -184,18 +178,10 @@ static struct fs_node* overlay_finddir_impl(struct fs_node* node, const char* na
     fs_node_t* upper_child = NULL;
     fs_node_t* lower_child = NULL;
 
-    if (dir->upper) {
-        if (dir->upper->f_ops && dir->upper->f_ops->finddir)
-            upper_child = dir->upper->f_ops->finddir(dir->upper, name);
-        else if (dir->upper->finddir)
-            upper_child = dir->upper->finddir(dir->upper, name);
-    }
-    if (dir->lower) {
-        if (dir->lower->f_ops && dir->lower->f_ops->finddir)
-            lower_child = dir->lower->f_ops->finddir(dir->lower, name);
-        else if (dir->lower->finddir)
-            lower_child = dir->lower->finddir(dir->lower, name);
-    }
+    if (dir->upper && dir->upper->f_ops && dir->upper->f_ops->finddir)
+        upper_child = dir->upper->f_ops->finddir(dir->upper, name);
+    if (dir->lower && dir->lower->f_ops && dir->lower->f_ops->finddir)
+        lower_child = dir->lower->f_ops->finddir(dir->lower, name);
 
     if (!upper_child && !lower_child) return 0;
     return overlay_wrap_child(dir, name, lower_child, upper_child);
@@ -225,8 +211,6 @@ fs_node_t* overlayfs_create_root(fs_node_t* lower_root, fs_node_t* upper_root) {
     root->vfs.inode = upper_root->inode;
     root->vfs.length = 0;
     root->vfs.f_ops = &overlay_dir_ops;
-    root->vfs.finddir = &overlay_finddir_impl;
-    root->vfs.readdir = &overlay_readdir_impl;
 
     root->path[0] = 0;
 
index 788c3b38b3d37906bc454ea1abf0d157e26933ef..d4320ad18b2cc6b63d71abccf2aa8cc6291f8fd5 100644 (file)
@@ -113,11 +113,6 @@ fs_node_t* persistfs_create_root(int drive) {
         g_root.inode = 1;
         g_root.length = 0;
         g_root.f_ops = &persistfs_root_fops;
-        g_root.read = 0;
-        g_root.write = 0;
-        g_root.open = 0;
-        g_root.close = 0;
-        g_root.finddir = &persist_root_finddir;
 
         memset(&g_counter, 0, sizeof(g_counter));
         strcpy(g_counter.name, "counter");
@@ -125,11 +120,6 @@ fs_node_t* persistfs_create_root(int drive) {
         g_counter.inode = 2;
         g_counter.length = 512;
         g_counter.f_ops = &persistfs_counter_fops;
-        g_counter.read = &persist_counter_read;
-        g_counter.write = &persist_counter_write;
-        g_counter.open = 0;
-        g_counter.close = 0;
-        g_counter.finddir = 0;
     }
 
     return g_ready ? &g_root : 0;
index ed2f1f3b11a97c775ff4c680ec081fb5e1148a8d..ce21f63aea03131ab3a3241a0c017279dc238a8e 100644 (file)
@@ -249,7 +249,6 @@ static fs_node_t* proc_pid_finddir(fs_node_t* node, const char* name) {
         g_pid_status[slot].flags = FS_FILE;
         g_pid_status[slot].inode = pid;
         g_pid_status[slot].f_ops = &procfs_pid_status_fops;
-        g_pid_status[slot].read = proc_pid_status_read;
         return &g_pid_status[slot];
     }
     if (strcmp(name, "maps") == 0) {
@@ -259,7 +258,6 @@ static fs_node_t* proc_pid_finddir(fs_node_t* node, const char* name) {
         g_pid_maps[slot].flags = FS_FILE;
         g_pid_maps[slot].inode = pid;
         g_pid_maps[slot].f_ops = &procfs_pid_maps_fops;
-        g_pid_maps[slot].read = proc_pid_maps_read;
         return &g_pid_maps[slot];
     }
     return NULL;
@@ -299,8 +297,6 @@ static fs_node_t* proc_get_pid_dir(uint32_t pid) {
     g_pid_dir[slot].flags = FS_DIRECTORY;
     g_pid_dir[slot].inode = pid;
     g_pid_dir[slot].f_ops = &procfs_pid_dir_fops;
-    g_pid_dir[slot].finddir = proc_pid_finddir;
-    g_pid_dir[slot].readdir = proc_pid_readdir;
     return &g_pid_dir[slot];
 }
 
@@ -451,39 +447,31 @@ fs_node_t* procfs_create_root(void) {
     strcpy(g_proc_root.name, "proc");
     g_proc_root.flags = FS_DIRECTORY;
     g_proc_root.f_ops = &procfs_root_fops;
-    g_proc_root.finddir = proc_root_finddir;
-    g_proc_root.readdir = proc_root_readdir;
 
     memset(&g_proc_self, 0, sizeof(g_proc_self));
     strcpy(g_proc_self.name, "self");
     g_proc_self.flags = FS_DIRECTORY;
     g_proc_self.f_ops = &procfs_self_fops;
-    g_proc_self.finddir = proc_self_finddir;
-    g_proc_self.readdir = proc_self_readdir;
 
     memset(&g_proc_self_status, 0, sizeof(g_proc_self_status));
     strcpy(g_proc_self_status.name, "status");
     g_proc_self_status.flags = FS_FILE;
     g_proc_self_status.f_ops = &procfs_self_status_fops;
-    g_proc_self_status.read = proc_self_status_read;
 
     memset(&g_proc_uptime, 0, sizeof(g_proc_uptime));
     strcpy(g_proc_uptime.name, "uptime");
     g_proc_uptime.flags = FS_FILE;
     g_proc_uptime.f_ops = &procfs_uptime_fops;
-    g_proc_uptime.read = proc_uptime_read;
 
     memset(&g_proc_meminfo, 0, sizeof(g_proc_meminfo));
     strcpy(g_proc_meminfo.name, "meminfo");
     g_proc_meminfo.flags = FS_FILE;
     g_proc_meminfo.f_ops = &procfs_meminfo_fops;
-    g_proc_meminfo.read = proc_meminfo_read;
 
     memset(&g_proc_cmdline, 0, sizeof(g_proc_cmdline));
     strcpy(g_proc_cmdline.name, "cmdline");
     g_proc_cmdline.flags = FS_FILE;
     g_proc_cmdline.f_ops = &procfs_cmdline_fops;
-    g_proc_cmdline.read = proc_cmdline_read;
 
     return &g_proc_root;
 }
index c1a56c4cd040d13e4ad3ef0c4ebb4bfbcaa248af..24f2ff53a19c853629dd131be6a9b4f5fc662a1b 100644 (file)
@@ -142,9 +142,6 @@ static void pty_init_pair(int idx) {
     p->master_node.flags = FS_CHARDEVICE;
     p->master_node.inode = PTY_MASTER_INO_BASE + (uint32_t)idx;
     p->master_node.f_ops = &pty_master_fops;
-    p->master_node.read = &pty_master_read_fn;
-    p->master_node.write = &pty_master_write_fn;
-    p->master_node.poll = &pty_master_poll_fn;
 
     memset(&p->slave_node, 0, sizeof(p->slave_node));
     name[0] = '0' + (char)idx;
@@ -153,10 +150,6 @@ static void pty_init_pair(int idx) {
     p->slave_node.flags = FS_CHARDEVICE;
     p->slave_node.inode = PTY_SLAVE_INO_BASE + (uint32_t)idx;
     p->slave_node.f_ops = &pty_slave_fops;
-    p->slave_node.read = &pty_slave_read_fn;
-    p->slave_node.write = &pty_slave_write_fn;
-    p->slave_node.ioctl = &pty_slave_ioctl_fn;
-    p->slave_node.poll = &pty_slave_poll_fn;
 }
 
 /* --- DevFS pts directory callbacks --- */
@@ -248,9 +241,6 @@ void pty_init(void) {
     g_dev_ptmx_node.flags = FS_CHARDEVICE;
     g_dev_ptmx_node.inode = PTY_MASTER_INO_BASE;
     g_dev_ptmx_node.f_ops = &pty_ptmx_fops;
-    g_dev_ptmx_node.read = &pty_ptmx_read_fn;
-    g_dev_ptmx_node.write = &pty_ptmx_write_fn;
-    g_dev_ptmx_node.poll = &pty_master_poll_fn;
     devfs_register_device(&g_dev_ptmx_node);
 
     /* Register /dev/pts directory */
@@ -259,8 +249,6 @@ void pty_init(void) {
     g_dev_pts_dir_node.flags = FS_DIRECTORY;
     g_dev_pts_dir_node.inode = 5;
     g_dev_pts_dir_node.f_ops = &pty_pts_dir_fops;
-    g_dev_pts_dir_node.finddir = &pty_pts_finddir;
-    g_dev_pts_dir_node.readdir = &pty_pts_readdir;
     devfs_register_device(&g_dev_pts_dir_node);
 }
 
index 60a3c22660b76c417a2928ceef42d3c908b7afdf..efca96b0f1283d89c98d1acd5b91357f5a83b5d2 100644 (file)
@@ -264,7 +264,6 @@ static int poll_wait_kfds(struct pollfd* kfds, uint32_t nfds, int32_t timeout) {
 
             int (*fn_poll)(fs_node_t*, int) = NULL;
             if (n->f_ops && n->f_ops->poll) fn_poll = n->f_ops->poll;
-            else if (n->poll) fn_poll = n->poll;
             if (fn_poll) {
                 int vfs_events = 0;
                 if (kfds[i].events & POLLIN)  vfs_events |= VFS_POLL_IN;
@@ -421,17 +420,13 @@ static int pipe_node_create(struct pipe_state* ps, int is_read_end, fs_node_t**
     pn->is_read_end = is_read_end ? 1U : 0U;
     pn->node.flags = FS_FILE;
     pn->node.length = 0;
-    pn->node.close = pipe_close;
-    pn->node.poll = pipe_poll;
     if (pn->is_read_end) {
         strcpy(pn->node.name, "pipe:r");
         pn->node.f_ops = &pipe_read_fops;
-        pn->node.read = pipe_read;
         ps->readers++;
     } else {
         strcpy(pn->node.name, "pipe:w");
         pn->node.f_ops = &pipe_write_fops;
-        pn->node.write = pipe_write;
         ps->writers++;
     }
 
@@ -917,11 +912,8 @@ 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->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);
+        if (node->f_ops && node->f_ops->truncate) {
+            node->f_ops->truncate(node, 0);
             node->length = 0;
         }
     }
@@ -1155,7 +1147,6 @@ static int syscall_getdents_impl(int fd, void* user_buf, uint32_t len) {
     if (f->node->flags != FS_DIRECTORY) return -ENOTDIR;
     int (*fn_readdir)(struct fs_node*, uint32_t*, void*, uint32_t) = NULL;
     if (f->node->f_ops && f->node->f_ops->readdir) fn_readdir = f->node->f_ops->readdir;
-    else if (f->node->readdir) fn_readdir = f->node->readdir;
     if (!fn_readdir) return -ENOSYS;
 
     uint8_t kbuf[256];
@@ -1228,7 +1219,6 @@ static int syscall_read_impl(int fd, void* user_buf, uint32_t len) {
     {
         int (*fn_poll)(fs_node_t*, int) = NULL;
         if (f->node->f_ops && f->node->f_ops->poll) fn_poll = f->node->f_ops->poll;
-        else if (f->node->poll) fn_poll = f->node->poll;
         if (nonblock && fn_poll) {
             int rev = fn_poll(f->node, VFS_POLL_IN);
             if (!(rev & (VFS_POLL_IN | VFS_POLL_ERR | VFS_POLL_HUP)))
@@ -1257,7 +1247,7 @@ static int syscall_read_impl(int fd, void* user_buf, uint32_t len) {
         return (int)total;
     }
 
-    if (!(f->node->f_ops && f->node->f_ops->read) && !f->node->read) return -ESPIPE;
+    if (!(f->node->f_ops && f->node->f_ops->read)) return -ESPIPE;
 
     uint8_t kbuf[256];
     uint32_t total = 0;
@@ -1299,14 +1289,13 @@ static int syscall_write_impl(int fd, const void* user_buf, uint32_t len) {
     {
         int (*fn_poll)(fs_node_t*, int) = NULL;
         if (f->node->f_ops && f->node->f_ops->poll) fn_poll = f->node->f_ops->poll;
-        else if (f->node->poll) fn_poll = f->node->poll;
         if (nonblock && fn_poll) {
             int rev = fn_poll(f->node, VFS_POLL_OUT);
             if (!(rev & (VFS_POLL_OUT | VFS_POLL_ERR)))
                 return -EAGAIN;
         }
     }
-    if (!(f->node->f_ops && f->node->f_ops->write) && !f->node->write) return -ESPIPE;
+    if (!(f->node->f_ops && f->node->f_ops->write)) return -ESPIPE;
     if (f->node->flags != FS_FILE && f->node->flags != FS_CHARDEVICE && f->node->flags != FS_SOCKET) return -ESPIPE;
 
     if ((f->flags & O_APPEND) && (f->node->flags & FS_FILE)) {
@@ -1338,7 +1327,6 @@ static int syscall_ioctl_impl(int fd, uint32_t cmd, void* user_arg) {
 
     fs_node_t* n = f->node;
     if (n->f_ops && n->f_ops->ioctl) return n->f_ops->ioctl(n, cmd, user_arg);
-    if (n->ioctl) return n->ioctl(n, cmd, user_arg);
     return -ENOTTY;
 }
 
@@ -1520,7 +1508,7 @@ static uintptr_t syscall_mmap_impl(uintptr_t addr, uint32_t length, uint32_t pro
         if (fd < 0) return (uintptr_t)-EBADF;
         struct file* f = fd_get(fd);
         if (!f || !f->node) return (uintptr_t)-EBADF;
-        if (!(f->node->f_ops && f->node->f_ops->mmap) && !f->node->mmap) return (uintptr_t)-ENOSYS;
+        if (!(f->node->f_ops && f->node->f_ops->mmap)) return (uintptr_t)-ENOSYS;
         mmap_node = f->node;
     }
 
@@ -1546,7 +1534,7 @@ static uintptr_t syscall_mmap_impl(uintptr_t addr, uint32_t length, uint32_t pro
         /* Device-backed mmap: delegate to the node's mmap callback */
         uintptr_t (*fn_mmap)(fs_node_t*, uintptr_t, uint32_t, uint32_t, uint32_t) = NULL;
         if (mmap_node->f_ops && mmap_node->f_ops->mmap) fn_mmap = mmap_node->f_ops->mmap;
-        else fn_mmap = mmap_node->mmap;
+        if (!fn_mmap) return (uintptr_t)-ENOSYS;
         uintptr_t result = fn_mmap(mmap_node, base, aligned_len, prot, offset);
         if (!result) return (uintptr_t)-ENOMEM;
         base = result;
@@ -1700,7 +1688,6 @@ static int syscall_readlink_impl(const char* user_path, char* user_buf, uint32_t
     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 = fn_finddir(dir, leaf);
@@ -2382,7 +2369,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->f_ops && f->node->f_ops->read) && !f->node->read) { sc_ret(regs) = (uint32_t)-ESPIPE; return; }
+        if (!(f->node->f_ops && f->node->f_ops->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;
@@ -2408,7 +2395,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->f_ops && f->node->f_ops->write) && !f->node->write) { sc_ret(regs) = (uint32_t)-ESPIPE; return; }
+        if (!(f->node->f_ops && f->node->f_ops->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;
@@ -2656,9 +2643,6 @@ static fs_node_t* sock_node_create(int sid) {
     n->flags = FS_SOCKET;
     n->inode = (uint32_t)sid;
     n->f_ops = &sock_fops;
-    n->read = sock_node_read;
-    n->write = sock_node_write;
-    n->close = sock_node_close;
     return n;
 }
 
index d62c3c7a33f50f189bdc3a31cda639893811ae20..5557e1dae738eb1daa7654429fec2cad05419d80 100644 (file)
@@ -76,8 +76,6 @@ static struct tmpfs_node* tmpfs_child_ensure_dir(struct tmpfs_node* dir, const c
     struct tmpfs_node* nd = tmpfs_node_alloc(name, FS_DIRECTORY);
     if (!nd) return NULL;
     nd->vfs.f_ops = &tmpfs_dir_ops;
-    nd->vfs.finddir = tmpfs_finddir_impl;
-    nd->vfs.readdir = tmpfs_readdir_impl;
     tmpfs_child_add(dir, nd);
     return nd;
 }
@@ -206,8 +204,6 @@ fs_node_t* tmpfs_create_root(void) {
     if (!root) return NULL;
 
     root->vfs.f_ops = &tmpfs_dir_ops;
-    root->vfs.finddir = tmpfs_finddir_impl;
-    root->vfs.readdir = tmpfs_readdir_impl;
 
     return &root->vfs;
 }
@@ -223,8 +219,6 @@ int tmpfs_add_file(fs_node_t* root_dir, const char* name, const uint8_t* data, u
     if (!f) return -ENOMEM;
 
     f->vfs.f_ops = &tmpfs_file_ops;
-    f->vfs.read = tmpfs_read_impl;
-    f->vfs.write = tmpfs_write_impl;
 
     if (len) {
         f->data = (uint8_t*)kmalloc(len);
@@ -297,8 +291,6 @@ fs_node_t* tmpfs_create_file(fs_node_t* root_dir, const char* path, const uint8_
     if (!f) return NULL;
 
     f->vfs.f_ops = &tmpfs_file_ops;
-    f->vfs.read = tmpfs_read_impl;
-    f->vfs.write = tmpfs_write_impl;
 
     if (len && data) {
         f->data = (uint8_t*)kmalloc(len);
index fb8b0e425238c95f51ccfb46099169c83bfc1235..1118a9dca823e7bfb8e0bb3a393a345a301dc6c4 100644 (file)
@@ -474,10 +474,6 @@ void tty_init(void) {
     g_dev_console_node.flags = FS_CHARDEVICE;
     g_dev_console_node.inode = 10;
     g_dev_console_node.f_ops = &tty_fops;
-    g_dev_console_node.read = &tty_devfs_read;
-    g_dev_console_node.write = &tty_devfs_write;
-    g_dev_console_node.ioctl = &tty_devfs_ioctl;
-    g_dev_console_node.poll = &tty_devfs_poll;
     devfs_register_device(&g_dev_console_node);
 
     /* Register /dev/tty */
@@ -486,10 +482,6 @@ void tty_init(void) {
     g_dev_tty_node.flags = FS_CHARDEVICE;
     g_dev_tty_node.inode = 3;
     g_dev_tty_node.f_ops = &tty_fops;
-    g_dev_tty_node.read = &tty_devfs_read;
-    g_dev_tty_node.write = &tty_devfs_write;
-    g_dev_tty_node.ioctl = &tty_devfs_ioctl;
-    g_dev_tty_node.poll = &tty_devfs_poll;
     devfs_register_device(&g_dev_tty_node);
 }