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
31 #define VFS_IOBUF_FDIRTY 0x1
33 #define FSTYPE_ROFS 0x1
35 #define VFS_VALID_CHAR(chr) \
36 ('A' <= (chr) && (chr) <= 'Z' || 'a' <= (chr) && (chr) <= 'z' || \
37 '0' <= (chr) && (chr) <= '9' || (chr) == '.' || (chr) == '_' || \
40 extern struct hstr vfs_ddot;
41 extern struct hstr vfs_dot;
47 struct hlist_node fs_list;
50 int (*mount)(struct v_superblock* vsb, struct v_dnode* mount_point);
51 int (*unmount)(struct v_superblock* vsb);
56 struct llist_header sb_list;
60 struct filesystem* fs;
64 uint32_t (*read_capacity)(struct v_superblock* vsb);
65 uint32_t (*read_usage)(struct v_superblock* vsb);
73 void (*read_complete_callback)(struct dir_context* dctx,
81 int (*write)(struct v_file* file, void* buffer, size_t len);
82 int (*read)(struct v_file* file, void* buffer, size_t len);
83 int (*readdir)(struct v_file* file, struct dir_context* dctx);
84 int (*seek)(struct v_file* file, size_t offset);
85 int (*rename)(struct v_file* file, char* new_name);
86 int (*close)(struct v_file* file);
87 int (*sync)(struct v_file* file);
92 struct v_inode* inode;
93 struct v_dnode* dnode;
94 struct llist_header* f_list;
96 void* data; // 允许底层FS绑定他的一些专有数据
97 struct v_file_ops ops;
116 void* data; // 允许底层FS绑定他的一些专有数据
119 int (*create)(struct v_inode* this, struct v_file* file);
120 int (*open)(struct v_inode* this, struct v_file* file);
121 int (*sync)(struct v_inode* this);
122 int (*mkdir)(struct v_inode* this, struct v_dnode* dnode);
123 int (*rmdir)(struct v_inode* this);
124 int (*unlink)(struct v_inode* this);
125 int (*link)(struct v_inode* this, struct v_dnode* new_name);
126 int (*dir_lookup)(struct v_inode* this, struct v_dnode* dnode);
133 struct v_inode* inode;
134 struct v_dnode* parent;
135 struct hlist_node hash_list;
136 struct llist_header children;
137 struct llist_header siblings;
138 struct v_superblock* super_block;
141 void (*destruct)(struct v_dnode* dnode);
147 struct v_fd* fds[VFS_MAX_FD];
150 /* --- file system manager --- */
155 fsm_register(struct filesystem* fs);
158 fsm_get(const char* fs_name);
164 vfs_dcache_lookup(struct v_dnode* parent, struct hstr* str);
167 vfs_dcache_add(struct v_dnode* parent, struct v_dnode* dnode);
170 vfs_walk(struct v_dnode* start,
172 struct v_dnode** dentry,
173 struct hstr* component,
177 vfs_mount(const char* target, const char* fs_name, bdev_t device);
180 vfs_unmount(const char* target);
183 vfs_mount_at(const char* fs_name, bdev_t device, struct v_dnode* mnt_point);
186 vfs_unmount_at(struct v_dnode* mnt_point);
189 vfs_mkdir(const char* path, struct v_dnode** dentry);
192 vfs_open(struct v_dnode* dnode, struct v_file** file);
195 vfs_close(struct v_file* file);
198 vfs_fsync(struct v_file* file);
204 vfs_sb_free(struct v_superblock* sb);
210 vfs_d_free(struct v_dnode* dnode);
216 vfs_i_free(struct v_inode* inode);
217 #endif /* __LUNAIX_VFS_H */