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
17 #define VFS_INODE_TYPE_SYMLINK 0x8
20 #define VFS_EBADMNT -3
22 #define VFS_EENDOFDIR -5
27 #define VFS_WALK_MKPARENT 0x1
28 #define VFS_WALK_FSRELATIVE 0x2
29 #define VFS_WALK_PARENT 0x4
30 #define VFS_WALK_NOFOLLOW 0x4
32 #define VFS_IOBUF_FDIRTY 0x1
34 #define FSTYPE_ROFS 0x1
36 #define VFS_VALID_CHAR(chr) \
37 ('A' <= (chr) && (chr) <= 'Z' || 'a' <= (chr) && (chr) <= 'z' || \
38 '0' <= (chr) && (chr) <= '9' || (chr) == '.' || (chr) == '_' || \
41 extern struct hstr vfs_ddot;
42 extern struct hstr vfs_dot;
48 struct hlist_node fs_list;
51 int (*mount)(struct v_superblock* vsb, struct v_dnode* mount_point);
52 int (*unmount)(struct v_superblock* vsb);
57 struct llist_header sb_list;
61 struct filesystem* fs;
65 uint32_t (*read_capacity)(struct v_superblock* vsb);
66 uint32_t (*read_usage)(struct v_superblock* vsb);
74 void (*read_complete_callback)(struct dir_context* dctx,
82 int (*write)(struct v_file* file, void* buffer, size_t len);
83 int (*read)(struct v_file* file, void* buffer, size_t len);
84 int (*readdir)(struct v_file* file, struct dir_context* dctx);
85 int (*seek)(struct v_file* file, size_t offset);
86 int (*rename)(struct v_file* file, char* new_name);
87 int (*close)(struct v_file* file);
88 int (*sync)(struct v_file* file);
93 struct v_inode* inode;
94 struct v_dnode* dnode;
95 struct llist_header* f_list;
97 void* data; // 允许底层FS绑定他的一些专有数据
98 struct v_file_ops ops;
118 void* data; // 允许底层FS绑定他的一些专有数据
121 int (*create)(struct v_inode* this, struct v_file* file);
122 int (*open)(struct v_inode* this, struct v_file* file);
123 int (*sync)(struct v_inode* this);
124 int (*mkdir)(struct v_inode* this, struct v_dnode* dnode);
125 int (*rmdir)(struct v_inode* this);
126 int (*unlink)(struct v_inode* this);
127 int (*link)(struct v_inode* this, struct v_dnode* new_name);
128 int (*read_symlink)(struct v_inode* this, const char** path_out);
129 int (*symlink)(struct v_inode* this, const char* target);
130 int (*dir_lookup)(struct v_inode* this, struct v_dnode* dnode);
137 struct v_inode* inode;
138 struct v_dnode* parent;
139 struct hlist_node hash_list;
140 struct llist_header children;
141 struct llist_header siblings;
142 struct v_superblock* super_block;
145 void (*destruct)(struct v_dnode* dnode);
151 struct v_fd* fds[VFS_MAX_FD];
154 /* --- file system manager --- */
159 fsm_register(struct filesystem* fs);
162 fsm_get(const char* fs_name);
168 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
171 vfs_dcache_add(struct v_dnode* parent, struct v_dnode* dnode);
174 vfs_walk(struct v_dnode* start,
176 struct v_dnode** dentry,
177 struct hstr* component,
181 vfs_mount(const char* target, const char* fs_name, bdev_t device);
184 vfs_unmount(const char* target);
187 vfs_mount_at(const char* fs_name, bdev_t device, struct v_dnode* mnt_point);
190 vfs_unmount_at(struct v_dnode* mnt_point);
193 vfs_mkdir(const char* path, struct v_dnode** dentry);
196 vfs_open(struct v_dnode* dnode, struct v_file** file);
199 vfs_close(struct v_file* file);
202 vfs_fsync(struct v_file* file);
208 vfs_sb_free(struct v_superblock* sb);
214 vfs_d_free(struct v_dnode* dnode);
220 vfs_i_free(struct v_inode* inode);
221 #endif /* __LUNAIX_VFS_H */