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 #include <lunaix/status.h>
11 #define VFS_NAME_MAXLEN 128
14 #define VFS_INODE_TYPE_DIR 0x1
15 #define VFS_INODE_TYPE_FILE 0x2
16 #define VFS_INODE_TYPE_DEVICE 0x4
19 #define VFS_EBADMNT -3
21 #define VFS_EENDOFDIR -5
26 #define VFS_WALK_MKPARENT 0x1
27 #define VFS_WALK_FSRELATIVE 0x2
28 #define VFS_WALK_PARENT 0x4
30 #define VFS_IOBUF_FDIRTY 0x1
32 #define VFS_VALID_CHAR(chr) \
33 ('A' <= (chr) && (chr) <= 'Z' || 'a' <= (chr) && (chr) <= 'z' || \
34 '0' <= (chr) && (chr) <= '9' || (chr) == '.' || (chr) == '_' || \
41 struct hlist_node fs_list;
43 int (*mount)(struct v_superblock* vsb, struct v_dnode* mount_point);
44 int (*unmount)(struct v_superblock* vsb);
49 struct llist_header sb_list;
53 struct filesystem* fs;
57 uint32_t (*read_capacity)(struct v_superblock* vsb);
58 uint32_t (*read_usage)(struct v_superblock* vsb);
66 void (*read_complete_callback)(struct dir_context* dctx,
74 int (*write)(struct v_file* file, void* buffer, size_t len);
75 int (*read)(struct v_file* file, void* buffer, size_t len);
76 int (*readdir)(struct v_file* file, struct dir_context* dctx);
77 int (*seek)(struct v_file* file, size_t offset);
78 int (*rename)(struct v_file* file, char* new_name);
79 int (*close)(struct v_file* file);
80 int (*sync)(struct v_file* file);
85 struct v_inode* inode;
86 struct llist_header* f_list;
88 void* data; // 允许底层FS绑定他的一些专有数据
89 struct v_file_ops ops;
107 void* data; // 允许底层FS绑定他的一些专有数据
110 int (*create)(struct v_inode* inode, struct v_file* file);
111 int (*open)(struct v_inode* inode, struct v_file* file);
112 int (*sync)(struct v_inode* inode);
113 int (*mkdir)(struct v_inode* inode, struct v_dnode* dnode);
114 int (*dir_lookup)(struct v_inode* inode, struct v_dnode* dnode);
121 struct v_inode* inode;
122 struct v_dnode* parent;
123 struct hlist_node hash_list;
124 struct llist_header children;
125 struct llist_header siblings;
126 struct v_superblock* super_block;
129 void (*destruct)(struct v_dnode* dnode);
135 struct v_fd* fds[VFS_MAX_FD];
138 /* --- file system manager --- */
143 fsm_register(struct filesystem* fs);
146 fsm_get(const char* fs_name);
152 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
155 vfs_dcache_add(struct v_dnode* parent, struct v_dnode* dnode);
158 vfs_walk(struct v_dnode* start,
160 struct v_dnode** dentry,
161 struct hstr* component,
165 vfs_mount(const char* target, const char* fs_name, bdev_t device);
168 vfs_unmount(const char* target);
171 vfs_mount_at(const char* fs_name, bdev_t device, struct v_dnode* mnt_point);
174 vfs_unmount_at(struct v_dnode* mnt_point);
177 vfs_mkdir(const char* path, struct v_dnode** dentry);
180 vfs_open(struct v_dnode* dnode, struct v_file** file);
183 vfs_close(struct v_file* file);
186 vfs_fsync(struct v_file* file);
192 vfs_sb_free(struct v_superblock* sb);
198 vfs_d_free(struct v_dnode* dnode);
204 vfs_i_free(struct v_inode* inode);
205 #endif /* __LUNAIX_VFS_H */