feat: (vfs) write_page and read_page file operations
[lunaix-os.git] / lunaix-os / kernel / process / taskfs.c
index 14ca61c1c802cac01b2b1f8e382a18f019e645be..753470306ea4b852bff5154ad543873d8559ceda 100644 (file)
@@ -85,6 +85,7 @@ taskfs_readdir(struct v_file* file, struct dir_context* dctx)
     return 0;
 }
 
     return 0;
 }
 
+// ascii to pid
 pid_t
 taskfs_atop(const char* str)
 {
 pid_t
 taskfs_atop(const char* str)
 {
@@ -132,7 +133,9 @@ taskfs_dirlookup(struct v_inode* this, struct v_dnode* dnode)
 
 static struct v_file_ops taskfs_file_ops = { .close = default_file_close,
                                              .read = default_file_read,
 
 static struct v_file_ops taskfs_file_ops = { .close = default_file_close,
                                              .read = default_file_read,
+                                             .read_page = default_file_read,
                                              .write = default_file_write,
                                              .write = default_file_write,
+                                             .write_page = default_file_write,
                                              .readdir = taskfs_readdir,
                                              .seek = default_file_seek };
 static struct v_inode_ops taskfs_inode_ops = { .dir_lookup = taskfs_dirlookup,
                                              .readdir = taskfs_readdir,
                                              .seek = default_file_seek };
 static struct v_inode_ops taskfs_inode_ops = { .dir_lookup = taskfs_dirlookup,
@@ -148,14 +151,35 @@ taskfs_init_inode(struct v_superblock* vsb, struct v_inode* inode)
     inode->ops = &taskfs_inode_ops;
 }
 
     inode->ops = &taskfs_inode_ops;
 }
 
+static volatile struct v_superblock* taskfs_sb;
+
 int
 taskfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point)
 {
 int
 taskfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point)
 {
+    taskfs_sb = vsb;
     vsb->ops.init_inode = taskfs_init_inode;
 
     return taskfs_mknod(mount_point, 0, 0, VFS_IFDIR);
 }
 
     vsb->ops.init_inode = taskfs_init_inode;
 
     return taskfs_mknod(mount_point, 0, 0, VFS_IFDIR);
 }
 
+void
+taskfs_invalidate(pid_t pid)
+{
+    struct v_dnode *pos, *n;
+    struct v_inode* inode = vfs_i_find(taskfs_sb, taskfs_inode_id(pid, 0));
+
+    if (!inode)
+        return;
+
+    llist_for_each(pos, n, &inode->aka_dnodes, aka_list)
+    {
+        if (pos->ref_count > 1) {
+            continue;
+        }
+        vfs_d_free(pos);
+    }
+}
+
 #define ATTR_TABLE_LEN 16
 
 void
 #define ATTR_TABLE_LEN 16
 
 void