update readme
[lunaix-os.git] / lunaix-os / includes / lunaix / fs.h
index 2fee2f235f47d67d038e470f10b90600063653cf..024b4ea591ff952d4f94bacbf94c61b7faecccec 100644 (file)
@@ -97,6 +97,7 @@ struct v_superblock
     struct filesystem* fs;
     uint32_t iobuf_size;
     struct hbucket* i_cache;
+    void* data;
     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);
+
+    // 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);
@@ -172,7 +183,8 @@ struct v_fd
     int flags;
 };
 
-// FIXME how do we invalidate corresponding v_dnodes given the v_inode?
+//  [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
@@ -197,12 +209,13 @@ struct v_inode
     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;
 };
@@ -228,6 +241,7 @@ struct v_dnode
     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;
@@ -262,7 +276,7 @@ struct pcache_pg
     uint32_t flags;
     uint32_t fpos;
 };
-/* --- file system manager --- */
+
 void
 fsm_init();
 
@@ -281,6 +295,9 @@ fsm_get(const char* fs_name);
 void
 vfs_init();
 
+void
+vfs_export_attributes();
+
 struct v_dnode*
 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
 
@@ -330,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_pclose(struct v_file* file, pid_t pid);
+
 int
 vfs_close(struct v_file* file);
 
+void
+vfs_free_fd(struct v_fd* fd);
+
 int
 vfs_fsync(struct v_file* file);
 
@@ -378,6 +401,9 @@ 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);