update readme
[lunaix-os.git] / lunaix-os / includes / lunaix / fs.h
index b497954abce0373140bc97cf4f800dfab89f8561..024b4ea591ff952d4f94bacbf94c61b7faecccec 100644 (file)
@@ -97,6 +97,7 @@ struct v_superblock
     struct filesystem* fs;
     uint32_t iobuf_size;
     struct hbucket* i_cache;
     struct filesystem* fs;
     uint32_t iobuf_size;
     struct hbucket* i_cache;
+    void* data;
     struct
     {
         uint32_t (*read_capacity)(struct v_superblock* vsb);
     struct
     {
         uint32_t (*read_capacity)(struct v_superblock* vsb);
@@ -119,6 +120,16 @@ struct v_file_ops
 {
     int (*write)(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
     int (*read)(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
 {
     int (*write)(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
     int (*read)(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
+
+    // for operatiosn {write|read}_page, following are true:
+    //  + `len` always equals to PG_SIZE
+    //  + `fpos` always PG_SIZE aligned.
+    // These additional operations allow underlying fs to use more specialized
+    // and optimized code.
+
+    int (*write_page)(struct v_inode* inode, void* pg, size_t len, size_t fpos);
+    int (*read_page)(struct v_inode* inode, void* pg, size_t len, size_t fpos);
+
     int (*readdir)(struct v_file* file, struct dir_context* dctx);
     int (*seek)(struct v_inode* inode, size_t offset); // optional
     int (*close)(struct v_file* file);
     int (*readdir)(struct v_file* file, struct dir_context* dctx);
     int (*seek)(struct v_inode* inode, size_t offset); // optional
     int (*close)(struct v_file* file);
@@ -172,6 +183,19 @@ struct v_fd
     int flags;
 };
 
     int flags;
 };
 
+//  [v_inode::aka_nodes]
+//  how do we invalidate corresponding v_dnodes given the v_inode?
+/*
+    Consider taskfs, which is Lunaix's speak of Linux's procfs, that allow
+    info of every process being accessible via file system. Each process's
+    creation will result a creation of a directory under the root of task fs
+    with it's pid as name. But that dir must delete when process is killed, and
+    such deletion does not mediated by vfs itself, so there is a need of cache
+    syncing.
+    And this is also the case of all ramfs where argumentation to file tree is
+    performed by third party.
+*/
+
 struct v_inode
 {
     inode_t id;
 struct v_inode
 {
     inode_t id;
@@ -185,12 +209,13 @@ struct v_inode
     uint32_t link_count;
     uint32_t lb_usage;
     uint32_t fsize;
     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;
     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_ops* ops;
     struct v_file_ops* default_fops;
 };
@@ -216,6 +241,7 @@ struct v_dnode
     struct v_inode* inode;
     struct v_dnode* parent;
     struct hlist_node hash_list;
     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;
     struct llist_header children;
     struct llist_header siblings;
     struct v_superblock* super_block;
@@ -250,7 +276,7 @@ struct pcache_pg
     uint32_t flags;
     uint32_t fpos;
 };
     uint32_t flags;
     uint32_t fpos;
 };
-/* --- file system manager --- */
+
 void
 fsm_init();
 
 void
 fsm_init();
 
@@ -269,6 +295,9 @@ fsm_get(const char* fs_name);
 void
 vfs_init();
 
 void
 vfs_init();
 
+void
+vfs_export_attributes();
+
 struct v_dnode*
 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
 
 struct v_dnode*
 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
 
@@ -318,9 +347,15 @@ vfs_mkdir(const char* path, struct v_dnode** dentry);
 int
 vfs_open(struct v_dnode* dnode, struct v_file** file);
 
 int
 vfs_open(struct v_dnode* dnode, struct v_file** file);
 
+int
+vfs_pclose(struct v_file* file, pid_t pid);
+
 int
 vfs_close(struct v_file* file);
 
 int
 vfs_close(struct v_file* file);
 
+void
+vfs_free_fd(struct v_fd* fd);
+
 int
 vfs_fsync(struct v_file* file);
 
 int
 vfs_fsync(struct v_file* file);
 
@@ -357,6 +392,18 @@ vfs_dup_fd(struct v_fd* old, struct v_fd** new);
 int
 vfs_getfd(int fd, struct v_fd** fd_s);
 
 int
 vfs_getfd(int fd, struct v_fd** fd_s);
 
+int
+vfs_get_dtype(int itype);
+
+void
+vfs_ref_dnode(struct v_dnode* dnode);
+
+void
+vfs_unref_dnode(struct v_dnode* dnode);
+
+int
+vfs_get_path(struct v_dnode* dnode, char* buf, size_t size, int depth);
+
 void
 pcache_init(struct pcache* pcache);
 
 void
 pcache_init(struct pcache* pcache);