feat: vfs - path walking and dnode caching.
[lunaix-os.git] / lunaix-os / includes / lunaix / fs.h
1 #ifndef __LUNAIX_VFS_H
2 #define __LUNAIX_VFS_H
3
4 #include <hal/ahci/hba.h>
5 #include <lunaix/block.h>
6 #include <lunaix/ds/hashtable.h>
7 #include <lunaix/ds/hstr.h>
8 #include <lunaix/ds/llist.h>
9
10 #define VFS_NAME_MAXLEN 128
11
12 struct v_dnode;
13
14 struct filesystem
15 {
16     struct hlist_node fs_list;
17     struct hstr fs_name;
18     int (*mount)(struct v_superblock* vsb, struct v_dnode* mount_point);
19     int (*unmount)(struct v_superblock* vsb);
20 };
21
22 struct v_superblock
23 {
24     struct llist_header sb_list;
25     int fs_id;
26     bdev_t dev;
27     struct v_dnode* root;
28     struct filesystem* fs;
29     struct
30     {
31         uint32_t (*read_capacity)(struct v_superblock* vsb);
32         uint32_t (*read_usage)(struct v_superblock* vsb);
33     } ops;
34 };
35
36 struct v_file
37 {
38     struct v_inode* inode;
39     struct
40     {
41         void* data;
42         uint32_t size;
43         uint64_t lb_addr;
44         uint32_t offset;
45         int dirty;
46     } buffer;
47     struct
48     {
49         int (*write)(struct v_file* file, void* data_in, uint32_t size);
50         int (*read)(struct v_file* file, void* data_out, uint32_t size);
51         int (*readdir)(struct v_file* file, int dir_index);
52         int (*seek)(struct v_file* file, size_t offset);
53         int (*rename)(struct v_file* file, char* new_name);
54         int (*close)(struct v_file* file);
55         int (*sync)(struct v_file* file);
56     } ops;
57 };
58
59 struct v_inode
60 {
61     uint32_t itype;
62     uint32_t ctime;
63     uint32_t mtime;
64     uint64_t lb_addr;
65     uint32_t ref_count;
66     uint32_t lb_usage;
67     struct
68     {
69         int (*open)(struct v_inode* inode, struct v_file* file);
70         int (*sync)(struct v_inode* inode);
71         int (*mkdir)(struct v_inode* inode, struct v_dnode* dnode);
72         int (*dir_lookup)(struct v_inode* inode, struct v_dnode* dnode);
73     } ops;
74 };
75
76 struct v_dnode
77 {
78     struct hstr name;
79     struct v_inode* inode;
80     struct v_dnode* parent;
81     struct hlist_node hash_list;
82     struct llist_header children;
83     struct llist_header siblings;
84     struct v_superblock* super_block;
85 };
86
87 /* --- file system manager --- */
88 void
89 fsm_init();
90
91 void
92 fsm_register(struct filesystem* fs);
93
94 struct filesystem*
95 fsm_get(const char* fs_name);
96
97 #endif /* __LUNAIX_VFS_H */