- dentry_parent = get_parent_dentry(ctx->wim, from);
- if (!dentry_parent)
- return -ENOENT;
- if (!dentry_is_directory(dentry_parent))
- return -ENOTDIR;
-
- link_name = path_basename(from);
-
- if (get_dentry_child_with_name(dentry_parent, link_name))
- return -EEXIST;
- dentry = new_dentry_with_inode(link_name);
- if (!dentry)
- return -ENOMEM;
- inode = dentry->d_inode;
-
- inode->attributes = FILE_ATTRIBUTE_REPARSE_POINT;
- inode->reparse_tag = WIM_IO_REPARSE_TAG_SYMLINK;
- inode->ino = ctx->next_ino++;
- inode->resolved = true;
-
- if (inode_set_symlink(inode, to, ctx->wim->lookup_table, NULL) != 0)
- goto out_free_dentry;
-
- dentry_add_child(dentry_parent, dentry);
- return 0;
-out_free_dentry:
- free_dentry(dentry);
- return -ENOMEM;
+ ret = create_dentry(ctx, from, &dentry);
+ if (ret == 0) {
+ dentry->d_inode->attributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ dentry->d_inode->reparse_tag = WIM_IO_REPARSE_TAG_SYMLINK;
+ if (inode_set_symlink(dentry->d_inode, to,
+ ctx->wim->lookup_table, NULL))
+ {
+ unlink_dentry(dentry);
+ free_dentry(dentry);
+ ret = -ENOMEM;
+ }
+ }
+ return ret;