Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 39c3b7f91dbc3f66d2ae203a82aa19843bd4e778)
+++ uspace/srv/vfs/vfs_ops.c	(revision 7f59d6c9f9a3c91ae568af7f47309431be5b58ab)
@@ -552,4 +552,5 @@
 	/* Do not allow one path to be a prefix of the other. */
 	if (old[shared] == 0 || new[shared] == 0) {
+		vfs_node_put(base);
 		return EINVAL;
 	}
@@ -564,4 +565,5 @@
 		rc = vfs_lookup_internal(base, old, L_DIRECTORY, &base_lr);
 		if (rc != EOK) {
+			vfs_node_put(base);
 			fibril_rwlock_write_unlock(&namespace_rwlock);
 			return rc;
@@ -573,4 +575,12 @@
 		old += shared;
 		new += shared;
+	}
+
+	rc = vfs_lookup_internal(base, old, L_DISABLE_MOUNTS,
+	    &old_lr);
+	if (rc != EOK) {
+		vfs_node_put(base);
+		fibril_rwlock_write_unlock(&namespace_rwlock);
+		return rc;
 	}
 		
@@ -584,19 +594,19 @@
 		return rc;
 	}
-	
+
+	rc = vfs_link_internal(base, new, &old_lr.triplet);
+	if (rc != EOK) {
+		vfs_link_internal(base, old, &old_lr.triplet);
+		if (orig_unlinked) {
+			vfs_link_internal(base, new, &new_lr_orig.triplet);
+		}
+		vfs_node_put(base);
+		fibril_rwlock_write_unlock(&namespace_rwlock);
+		return rc;
+	}
+
 	rc = vfs_lookup_internal(base, old, L_UNLINK | L_DISABLE_MOUNTS,
 	    &old_lr);
 	if (rc != EOK) {
-		if (orig_unlinked) {
-			vfs_link_internal(base, new, &new_lr_orig.triplet);
-		}
-		vfs_node_put(base);
-		fibril_rwlock_write_unlock(&namespace_rwlock);
-		return rc;
-	}
-	
-	rc = vfs_link_internal(base, new, &old_lr.triplet);
-	if (rc != EOK) {
-		vfs_link_internal(base, old, &old_lr.triplet);
 		if (orig_unlinked) {
 			vfs_link_internal(base, new, &new_lr_orig.triplet);
