+ current_inode = current_level->inode;
+
+ if ((current_inode->itype & VFS_IFSYMLINK) &&
+ !(walk_options & VFS_WALK_NOFOLLOW)) {
+ const char* link;
+
+ if (!current_inode->ops->read_symlink) {
+ errno = ENOTSUP;
+ goto error;
+ }
+
+ lock_inode(current_inode);
+ if ((errno =
+ current_inode->ops->read_symlink(current_inode, &link))) {
+ unlock_inode(current_inode);
+ goto error;
+ }
+ unlock_inode(current_inode);
+
+ errno = __vfs_walk(current_level->parent,
+ link,
+ &dnode,
+ NULL,
+ 0,
+ depth + 1,
+ fname_buffer + name.len + 1);
+
+ if (errno) {
+ goto error;
+ }
+
+ // reposition the resolved subtree pointed by symlink
+ // vfs_dcache_rehash(current_level->parent, dnode);
+ current_level = dnode;
+ current_inode = dnode->inode;
+ }
+