uint32_t link_count;
uint32_t lb_usage;
uint32_t fsize;
+ void* data; // 允许底层FS绑定他的一些专有数据
+ struct llist_header aka_dnodes;
struct llist_header xattrs;
struct v_superblock* sb;
struct hlist_node hash_list;
struct lru_node lru;
struct pcache* pg_cache;
- void* data; // 允许底层FS绑定他的一些专有数据
struct v_inode_ops* ops;
struct v_file_ops* default_fops;
};
struct v_inode* inode;
struct v_dnode* parent;
struct hlist_node hash_list;
+ struct llist_header aka_list;
struct llist_header children;
struct llist_header siblings;
struct v_superblock* super_block;
uint32_t flags;
uint32_t fpos;
};
-/* --- file system manager --- */
+
void
fsm_init();
struct task_attribute*
taskfs_get_attr(struct hstr* key);
+void
+taskfs_invalidate(pid_t pid);
+
#endif /* __LUNAIX_TASKFS_H */
assert(dnode->ref_count == 1);
llist_delete(&dnode->siblings);
+ llist_delete(&dnode->aka_list);
hlist_delete(&dnode->hash_list);
dnode->parent = NULL;
vfs_assign_inode(struct v_dnode* assign_to, struct v_inode* inode)
{
if (assign_to->inode) {
+ llist_delete(&assign_to->aka_list);
assign_to->inode->link_count--;
}
+ llist_append(&inode->aka_dnodes, &assign_to->aka_list);
assign_to->inode = inode;
inode->link_count++;
}
memset(dnode, 0, sizeof(*dnode));
llist_init_head(&dnode->children);
llist_init_head(&dnode->siblings);
+ llist_init_head(&dnode->aka_list);
mutex_init(&dnode->lock);
dnode->ref_count = ATOMIC_VAR_INIT(0);
memset(inode, 0, sizeof(*inode));
mutex_init(&inode->lock);
llist_init_head(&inode->xattrs);
+ llist_init_head(&inode->aka_dnodes);
sb->ops.init_inode(sb, inode);
#include <hal/apic.h>
#include <hal/cpu.h>
+#include <lunaix/fs/taskfs.h>
#include <lunaix/mm/cake.h>
#include <lunaix/mm/kalloc.h>
#include <lunaix/mm/pmm.h>
llist_delete(&proc->tasks);
llist_delete(&proc->sleep.sleepers);
+ taskfs_invalidate(pid);
+
if (proc->cwd) {
vfs_unref_dnode(proc->cwd);
}
return 0;
}
+// ascii to pid
pid_t
taskfs_atop(const char* str)
{
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