23#define RBT_TYPE vnode_t
32#define VFS_MAX_PATH_CACHE 512
33#define CALC_PATH_HASH_LEN(path, curr_depth) \
34 4096 + 1024 * pow(strlen(path), curr_depth)
57 NIL->data = create_vnode();
63 root_inode->permission = 660;
68 auto entry = create_dentry(
str(
"/"), root_inode, 0);
77 .magic = {
'C',
'D',
'0',
'0',
'1'},
101 LOG_INFO(
"vfs",
"vfs has been installed");
107 if (!fs || !dev_dentry || !
dentry)
114 LOG2_WARN(
"VFS",
"vfs_mount: fs %s not found", fs);
118 if (!fs_->data.ops) {
119 LOG2_WARN(
"VFS",
"vfs_mount: fs %s ops not found", fs);
123 auto dev_vnode = dev_dentry->
vnode;
125 LOG2_WARN(
"VFS",
"vfs_mount_dev: dev vnode not found");
130 LOG2_WARN(
"VFS",
"vfs_mount: dev not a block device");
135 retrieve_dev(dev_vnode->device.major, dev_vnode->device.minor);
138 LOG2_WARN(
"VFS",
"vfs_mount_dev: cdev not found");
147 "vfs_mount: created vnode for mount point dentry");
148 dentry_node = create_vnode();
155 dev_vnode->mount =
cdev;
166 fs_->data.ops->lookup(fs_ins, 0, 0, &
dentry);
192 LOG2_WARN(
"VFS",
"umount: dentry '%s' (%d) still in use",
273 memset(d_, 0, request_size);
284 int ret =
ops->read(
vnode, 16, d_, request_size);
294 LOG2_INFO(
"VFS NOTIFY",
"terdeteksi ISO9660 CD-ROM");
300 vxnamei(
"/tmp/root", &mount_entry);
310 "found root filesystem at %s",
314 is_contain_root =
true;
324 if (is_contain_root) {
369 vfs_notify_probe_handler(
data, ctx);
376 LOG2_DEBUG(
"VFS NOTIFY",
"new event detected (%d)", event);
struct vfs_cache * get_root_cache()
void cache_remove(struct vfs_cache *cache, struct dentry *dentry)
int get_reffcount(dentry_ptr dentry)
void dentry_get(dentry_ptr dentry)
struct dentry * dentry_ptr
void dentry_put(dentry_ptr dentry)
void vxSetDentryAsRoot(dentry_ptr dentry)
int resolve_dentry(char *path, dentry_ptr parent, dentry_ptr *out, uint8_t flag)
Resolves a path to a directory entry (dentry) with configurable start point and strictness.
kstring get_full_path_from_dentry(dentry_ptr dentry)
struct vnode * vnode_ptr_t
int vxnamei(const char *path, dentry_ptr *out)
Resolves a file path to a directory entry (dentry).
cdev_ptr_t retrieve_dev(uint32_t major, uint32_t minor)
int create_filesystem(char name[16], struct fs_data *fs_data)
filesystem_ptr_t retrieve_filesystem(const char name[16])
void serial2_printf(const char *fmt,...)
fs_operations_t * iso9660_fs_operations(void)
void * kalloc(size_t size)
static void llist_del(struct llist_head *entry)
void notify_dev_create(kstring name)
int notify_call(char *name, uint32_t event, void *data)
int notify_register(char *name, struct notifier *n)
static int rbt_insert_node(rbt_node **root, rbt_node *z, struct __rbt_type *data, rbt_node *NIL)
#define LOG2_WARN(mod, fmt,...)
#define LOG2_DEBUG(mod, fmt,...)
#define LOG_INFO(mod, fmt,...)
#define LOG2_INFO(mod, fmt,...)
#define LOG_DEBUG(mod, fmt,...)
void * vxSlabAlloc(struct slab_cache *cache)
void vxCreateSlabCache(struct slab_cache **cache, const char *name, const size_t obj_size, size_t alignment, const uintptr_t virt_addr)
int strncmp(const char *s1, const char *s2, size_t n)
void memset(void *ptr, int value, size_t num)
void str_release(kstring str)
kstring str(const char *str)
struct llist_head child_list
struct fs_instance * fs_instance
#define container_of(ptr, type, member)
static rbt_node * vfs_tree
int vfs_umount(dentry_ptr dentry)
static int vfs_umount_recursive(dentry_t *dentry)
static void vfs_event_handler(uint32_t event, void *data, void *ctx)
vnode_t * create_and_attach_vnode()
int vfs_mount(dentry_ptr dev_dentry, char *fs, dentry_ptr dentry, int flags)
static struct slab_cache * rbt_node_cache
struct vops_blk vops_blk_t