+ current_inode = current_level->inode;
+
+ assert(current_inode);
+
+ if (check_symlink_node(current_inode) &&
+ !(walk_options & VFS_WALK_NOFOLLOW)) {
+ const char* link;
+ struct v_inode_ops* iops;
+
+ iops = current_inode->ops;
+
+ if (!iops->read_symlink) {
+ errno = ENOTSUP;
+ goto error;
+ }
+
+ lock_inode(current_inode);
+
+ errno = iops->read_symlink(current_inode, &link);
+ if ((errno < 0)) {
+ 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;
+ }
+
+ current_level = dnode;
+ current_inode = dnode->inode;
+ }
+