- dnode = vfs_dcache_lookup(current_level, &name);
-
- if (!dnode) {
- dnode = vfs_d_alloc();
- dnode->name = HHSTR(valloc(VFS_NAME_MAXLEN), j, name.hash);
-
- strcpy(dnode->name.value, name_content);
-
- lock_inode(current_level->inode);
-
- errno =
- current_level->inode->ops.dir_lookup(current_level->inode, dnode);
-
- if (errno == ENOENT && (walk_options & VFS_WALK_MKPARENT)) {
- if (!current_level->inode->ops.mkdir) {
- errno = ENOTSUP;
- } else {
- errno = current_level->inode->ops.mkdir(
- current_level->inode, dnode);
- }
- }
-
- unlock_inode(current_level->inode);
-
- if (errno) {
- unlock_dnode(current_level);
- vfree(dnode->name.value);
- goto error;
- }
-
- vfs_dcache_add(current_level, dnode);
-
- dnode->parent = current_level;
- llist_append(¤t_level->children, &dnode->siblings);
- }
-
- unlock_dnode(current_level);
-
- j = 0;
- current_level = dnode;
- cont:
- current = lookahead;
- };
-
- *dentry = current_level;
- return 0;
-
-error:
- vfree(dnode->name.value);
- vfs_d_free(dnode);
- *dentry = NULL;
- return errno;
-}
-
-#define VFS_MAX_SYMLINK 16
-
-int
-vfs_walk(struct v_dnode* start,
- const char* path,
- struct v_dnode** dentry,
- struct hstr* component,
- int options)
-{
- struct v_dnode* interim;
- const char* pathname = path;
- int errno = __vfs_walk(start, path, &interim, component, options);
- int counter = 0;
-
- while (!errno) {
- if (counter >= VFS_MAX_SYMLINK) {
- errno = ELOOP;
- continue;
- }
- if ((interim->inode->itype & VFS_IFSYMLINK) &&
- !(options & VFS_WALK_NOFOLLOW) &&
- interim->inode->ops.read_symlink) {
- errno = interim->inode->ops.read_symlink(interim->inode, &pathname);
- if (errno) {
- break;
- }
- } else {
- break;
- }
- errno = __vfs_walk(start, pathname, &interim, component, options);
- counter++;
- }
-
- *dentry = errno ? 0 : interim;
-
- return errno;
-}
-
-int
-vfs_mount(const char* target, const char* fs_name, bdev_t device)
-{
- int errno;
- struct v_dnode* mnt;
-
- if (!(errno = vfs_walk(__current->cwd, target, &mnt, NULL, 0))) {
- errno = vfs_mount_at(fs_name, device, mnt);
- }