Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 4ef6645dd99822554c46ff276f9076d4bed7c09d)
+++ uspace/srv/vfs/vfs_ops.c	(revision 493853ecc88c704ed1dadcd05ad985fb28e0a32c)
@@ -75,5 +75,4 @@
 RWLOCK_INITIALIZE(namespace_rwlock);
 
-futex_t rootfs_futex = FUTEX_INITIALIZER;
 vfs_pair_t rootfs = {
 	.fs_handle = 0,
@@ -96,15 +95,12 @@
 	ipc_call_t answer;
 			
-
 	/* Resolve the path to the mountpoint. */
-	futex_down(&rootfs_futex);
+	rwlock_write_lock(&namespace_rwlock);
 	if (rootfs.fs_handle) {
 		/* We already have the root FS. */
-		rwlock_write_lock(&namespace_rwlock);
 		if (str_cmp(mp, "/") == 0) {
 			/* Trying to mount root FS over root FS */
+			ipc_answer_0(rid, EBUSY);
 			rwlock_write_unlock(&namespace_rwlock);
-			futex_up(&rootfs_futex);
-			ipc_answer_0(rid, EBUSY);
 			return;
 		}
@@ -113,7 +109,6 @@
 		if (rc != EOK) {
 			/* The lookup failed for some reason. */
+			ipc_answer_0(rid, rc);
 			rwlock_write_unlock(&namespace_rwlock);
-			futex_up(&rootfs_futex);
-			ipc_answer_0(rid, rc);
 			return;
 		}
@@ -121,7 +116,6 @@
 		mp_node = vfs_node_get(&mp_res);
 		if (!mp_node) {
+			ipc_answer_0(rid, ENOMEM);
 			rwlock_write_unlock(&namespace_rwlock);
-			futex_up(&rootfs_futex);
-			ipc_answer_0(rid, ENOMEM);
 			return;
 		}
@@ -132,5 +126,4 @@
 		 * This prevents the mount point from being deleted.
 		 */
-		rwlock_write_unlock(&namespace_rwlock);
 	} else {
 		/* We still don't have the root file system mounted. */
@@ -151,6 +144,6 @@
 				async_wait_for(msg, NULL);
 				vfs_release_phone(phone);
-				futex_up(&rootfs_futex);
 				ipc_answer_0(rid, rc);
+				rwlock_write_unlock(&namespace_rwlock);
 				return;
 			}
@@ -159,6 +152,6 @@
 			
 			if (rc != EOK) {
-				futex_up(&rootfs_futex);
 				ipc_answer_0(rid, rc);
+				rwlock_write_unlock(&namespace_rwlock);
 				return;
 			}
@@ -177,5 +170,4 @@
 			rootfs.fs_handle = fs_handle;
 			rootfs.dev_handle = dev_handle;
-			futex_up(&rootfs_futex);
 			
 			/* Add reference to the mounted root. */
@@ -184,4 +176,5 @@
 			
 			ipc_answer_0(rid, rc);
+			rwlock_write_unlock(&namespace_rwlock);
 			return;
 		} else {
@@ -190,10 +183,9 @@
 			 * being mounted first.
 			 */
-			futex_up(&rootfs_futex);
 			ipc_answer_0(rid, ENOENT);
+			rwlock_write_unlock(&namespace_rwlock);
 			return;
 		}
 	}
-	futex_up(&rootfs_futex);
 	
 	/*
@@ -222,4 +214,5 @@
 			vfs_node_put(mp_node);
 		ipc_answer_0(rid, rc);
+		rwlock_write_unlock(&namespace_rwlock);
 		return;
 	}
@@ -234,4 +227,5 @@
 			vfs_node_put(mp_node);
 		ipc_answer_0(rid, rc);
+		rwlock_write_unlock(&namespace_rwlock);
 		return;
 	}
@@ -239,26 +233,27 @@
 	vfs_release_phone(phone);
 	
-	if (rc != EOK) {
+	if (rc == EOK) {
+		rindex = (fs_index_t) IPC_GET_ARG1(answer);
+		rsize = (size_t) IPC_GET_ARG2(answer);
+		rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
+	
+		mr_res.triplet.fs_handle = fs_handle;
+		mr_res.triplet.dev_handle = dev_handle;
+		mr_res.triplet.index = rindex;
+		mr_res.size = rsize;
+		mr_res.lnkcnt = rlnkcnt;
+		mr_res.type = VFS_NODE_DIRECTORY;
+	
+		/* Add reference to the mounted root. */
+		mr_node = vfs_node_get(&mr_res); 
+		assert(mr_node);
+	} else {
 		/* Mount failed, drop reference to mp_node. */
 		if (mp_node)
 			vfs_node_put(mp_node);
 	}
-	
-	rindex = (fs_index_t) IPC_GET_ARG1(answer);
-	rsize = (size_t) IPC_GET_ARG2(answer);
-	rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
-	
-	mr_res.triplet.fs_handle = fs_handle;
-	mr_res.triplet.dev_handle = dev_handle;
-	mr_res.triplet.index = rindex;
-	mr_res.size = rsize;
-	mr_res.lnkcnt = rlnkcnt;
-	mr_res.type = VFS_NODE_DIRECTORY;
-	
-	/* Add reference to the mounted root. */
-	mr_node = vfs_node_get(&mr_res); 
-	assert(mr_node);
 
 	ipc_answer_0(rid, rc);
+	rwlock_write_unlock(&namespace_rwlock);
 }
 
