X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/61a1daa59589212608039e2734009870818bacd3..f044ca812256b421e793c4335ce1ffed74710a70:/lunaix-os/kernel/process/taskfs.c diff --git a/lunaix-os/kernel/process/taskfs.c b/lunaix-os/kernel/process/taskfs.c index 1e4ad2d..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) { @@ -111,7 +113,8 @@ taskfs_dirlookup(struct v_inode* this, struct v_dnode* dnode) if (!tattr || !(proc = get_process(pid))) return ENOENT; - int errno = taskfs_mknod(dnode, pid, taskfs_next_counter(), VFS_IFFILE); + int errno = + taskfs_mknod(dnode, pid, taskfs_next_counter(), VFS_IFSEQDEV); if (!errno) { tattr->map_file->data = proc; dnode->inode->data = tattr->map_file; @@ -131,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, @@ -147,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 @@ -200,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