Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision d4067a792b7c6d4786058f0ae59ea029852a9a9d)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision 1e2e579533f6448e05e8644a674457f8a81b25ec)
@@ -630,4 +630,35 @@
 }
 
+static int get_parent_and_child(const char *path, char **child)
+{
+	size_t size;
+	char *apath = vfs_absolutize(path, &size);
+	if (!apath)
+		return ENOMEM;
+
+	char *slash = str_rchr(apath, L'/');
+	int parent;
+	if (slash == apath) {
+		parent = vfs_root();
+		*child = apath;
+	} else {
+		*slash = '\0';
+		parent = vfs_lookup(apath, WALK_DIRECTORY);
+		if (parent < 0) {
+			free(apath);
+			return parent;
+		}
+		*slash = '/';
+		*child = str_dup(slash);
+		free(apath);
+		if (!*child) {
+			vfs_put(parent);
+			return ENOMEM;
+		}
+	}
+
+	return parent;
+}
+
 int vfs_link(int parent, const char *child, vfs_file_kind_t kind)
 {
@@ -651,27 +682,12 @@
 int vfs_link_path(const char *path, vfs_file_kind_t kind)
 {
-	size_t pa_size;
-	char *pa = vfs_absolutize(path, &pa_size);
-	if (!pa)
-		return ENOMEM;
-
-	int parent;
-	char *slash = str_rchr(pa, L'/');
-	if (slash != pa) {
-		*slash = '\0';
-		parent = vfs_lookup(pa, WALK_DIRECTORY);
-		*slash = '/';
-	} else {
-		parent = vfs_root();
-	}
-
-	if (parent < 0) {
-		free(pa);
+	char *child;
+	int parent = get_parent_and_child(path, &child);
+	if (parent < 0)
 		return parent;
-	}
-
-	int rc = vfs_link(parent, slash, kind);
-
-	free(pa);
+
+	int rc = vfs_link(parent, child, kind);
+
+	free(child);
 	vfs_put(parent);
 	return rc;
@@ -705,34 +721,18 @@
 int vfs_unlink_path(const char *path)
 {
-	size_t pa_size;
-	char *pa = vfs_absolutize(path, &pa_size);
-	if (!pa)
-		return ENOMEM;
-
-	int parent;
 	int expect = vfs_lookup(path, 0);
-	if (expect < 0) {
-		free(pa);
+	if (expect < 0)
 		return expect;
-	}
-
-	char *slash = str_rchr(pa, L'/');
-	if (slash != pa) {
-		*slash = '\0';
-		parent = vfs_lookup(pa, 0);
-		*slash = '/';
-	} else {
-		parent = vfs_root();
-	}
-
+
+	char *child;
+	int parent = get_parent_and_child(path, &child);
 	if (parent < 0) {
-		free(pa);
 		vfs_put(expect);
 		return parent;
 	}
 
-	int rc = vfs_unlink(parent, slash, expect);
-	
-	free(pa);
+	int rc = vfs_unlink(parent, child, expect);
+	
+	free(child);
 	vfs_put(parent);
 	vfs_put(expect);
