feat: fstat now handle symbolic link
[lunaix-os.git] / lunaix-os / kernel / process / taskfs.c
index 14ca61c1c802cac01b2b1f8e382a18f019e645be..36ed5ee28d52aef1f8a6f84e627a278bbb3a2575 100644 (file)
@@ -1,4 +1,3 @@
-#include <lunaix/dirent.h>
 #include <lunaix/fs/taskfs.h>
 #include <lunaix/fs/twimap.h>
 #include <lunaix/mm/valloc.h>
@@ -8,6 +7,8 @@
 #include <klibc/stdio.h>
 #include <klibc/string.h>
 
+#include <usr/lunaix/dirent_defs.h>
+
 #define COUNTER_MASK ((1 << 16) - 1)
 
 static struct hbucket* attr_export_table;
@@ -85,6 +86,7 @@ taskfs_readdir(struct v_file* file, struct dir_context* dctx)
     return 0;
 }
 
+// ascii to pid
 pid_t
 taskfs_atop(const char* str)
 {
@@ -127,12 +129,14 @@ taskfs_dirlookup(struct v_inode* this, struct v_dnode* dnode)
         return ENOENT;
     }
 
-    return taskfs_mknod(dnode, pid, 0, VFS_IFDIR);
+    return taskfs_mknod(dnode, pid, 0, F_FILE);
 }
 
 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_page = default_file_write,
                                              .readdir = taskfs_readdir,
                                              .seek = default_file_seek };
 static struct v_inode_ops taskfs_inode_ops = { .dir_lookup = taskfs_dirlookup,
@@ -148,14 +152,35 @@ taskfs_init_inode(struct v_superblock* vsb, struct v_inode* inode)
     inode->ops = &taskfs_inode_ops;
 }
 
+static volatile struct v_superblock* taskfs_sb;
+
 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);
 }
 
+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
@@ -201,4 +226,5 @@ taskfs_init()
     attr_export_table = vcalloc(ATTR_TABLE_LEN, sizeof(struct hbucket));
 
     export_task_attr();
-}
\ No newline at end of file
+}
+EXPORT_FILE_SYSTEM(taskfs, taskfs_init);
\ No newline at end of file