X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c50398ab4cb09658b3b3fff74804d2f26df785e7..f044ca812256b421e793c4335ce1ffed74710a70:/lunaix-os/kernel/process/taskfs.c diff --git a/lunaix-os/kernel/process/taskfs.c b/lunaix-os/kernel/process/taskfs.c index 14ca61c..2aa1ed9 100644 --- a/lunaix-os/kernel/process/taskfs.c +++ b/lunaix-os/kernel/process/taskfs.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -8,6 +7,8 @@ #include #include +#include + #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) { @@ -132,7 +134,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, + .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