Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs.h	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -135,4 +135,7 @@
 	unsigned refcnt;	/**< Usage counter. */
 	link_t nh_link;		/**< Node hash-table link. */
+
+	/** Holding this futex prevents modifications of the node's contents. */
+	atomic_t contents_futex;
 } vfs_node_t;
 
@@ -170,5 +173,6 @@
 extern link_t plb_head;		/**< List of active PLB entries. */
 
-extern atomic_t unlink_futex;	/**< VFS_{CREATE|OPEN|UNLINK} serialization. */
+/** Holding this futex prevents extern changes in file system namespace. */ 
+atomic_t namespace_futex;
 
 extern int vfs_grab_phone(int);
Index: uspace/srv/vfs/vfs_mount.c
===================================================================
--- uspace/srv/vfs/vfs_mount.c	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs_mount.c	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -155,7 +155,7 @@
 	/*
 	 * Lookup the root node of the filesystem being mounted.
-	 * In this case, we don't need to take the unlink_futex as the root node
-	 * cannot be removed. However, we do take a reference to it so that
-	 * we can track how many times it has been mounted.
+	 * In this case, we don't need to take the namespace_futex as the root
+	 * node cannot be removed. However, we do take a reference to it so
+	 * that we can track how many times it has been mounted.
 	 */
 	int rc;
@@ -183,5 +183,5 @@
 		 * We already have the root FS.
 		 */
-		futex_down(&unlink_futex);
+		futex_down(&namespace_futex);
 		rc = vfs_lookup_internal(buf, size, &mp, NULL);
 		if (rc != EOK) {
@@ -189,5 +189,5 @@
 			 * The lookup failed for some reason.
 			 */
-			futex_up(&unlink_futex);
+			futex_up(&namespace_futex);
 			futex_up(&rootfs_futex);
 			vfs_node_put(mr_node);	/* failed -> drop reference */
@@ -198,5 +198,5 @@
 		mp_node = vfs_node_get(&mp);
 		if (!mp_node) {
-			futex_up(&unlink_futex);
+			futex_up(&namespace_futex);
 			futex_up(&rootfs_futex);
 			vfs_node_put(mr_node);	/* failed -> drop reference */
@@ -210,5 +210,5 @@
 		 * This prevents the mount point from being deleted.
 		 */
-		futex_up(&unlink_futex);
+		futex_up(&namespace_futex);
 	} else {
 		/*
Index: uspace/srv/vfs/vfs_node.c
===================================================================
--- uspace/srv/vfs/vfs_node.c	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs_node.c	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -147,4 +147,5 @@
 		node->index = triplet->index;
 		link_initialize(&node->nh_link);
+		futex_initialize(&node->contents_futex, 1);
 		hash_table_insert(&nodes, key, &node->nh_link);
 	} else {
Index: uspace/srv/vfs/vfs_open.c
===================================================================
--- uspace/srv/vfs/vfs_open.c	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs_open.c	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -94,5 +94,5 @@
 	 * triplet.
 	 */
-	futex_down(&unlink_futex);
+	futex_down(&namespace_futex);
 
 	/*
@@ -102,5 +102,5 @@
 	rc = vfs_lookup_internal(path, size, &triplet, NULL);
 	if (rc) {
-		futex_up(&unlink_futex);
+		futex_up(&namespace_futex);
 		ipc_answer_0(rid, rc);
 		free(path);
@@ -114,5 +114,5 @@
 
 	vfs_node_t *node = vfs_node_get(&triplet);
-	futex_up(&unlink_futex);
+	futex_up(&namespace_futex);
 
 	/*
Index: uspace/srv/vfs/vfs_rdwr.c
===================================================================
--- uspace/srv/vfs/vfs_rdwr.c	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs_rdwr.c	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -40,4 +40,5 @@
 #include <async.h>
 #include <errno.h>
+#include <futex.h>
 
 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read)
@@ -81,4 +82,10 @@
 	}
 
+	/*
+	 * Lock the file's node so that no other client can read/write to it at
+	 * the same time.
+	 */
+	futex_down(&file->node->contents_futex);
+
 	int fs_phone = vfs_grab_phone(file->node->fs_handle);	
 	
@@ -109,4 +116,9 @@
 
 	/*
+	 * Unlock the VFS node.
+	 */
+	futex_up(&file->node->contents_futex);
+
+	/*
 	 * Update the position pointer.
 	 */
Index: uspace/srv/vfs/vfs_unlink.c
===================================================================
--- uspace/srv/vfs/vfs_unlink.c	(revision 215e375440748700b8ba4a90595039cbbd76cf85)
+++ uspace/srv/vfs/vfs_unlink.c	(revision f57f8ea58fde79450cfca65fd2c8f15643d3fb1c)
@@ -41,7 +41,7 @@
 /**
  * This futex prevents the race between a triplet-to-VFS-node resolution and a
- * concurrent VFS_UNLINK or VFS_RMDIR operation.
+ * concurrent VFS operation which modifies the file system namespace.
  */
-atomic_t unlink_futex = FUTEX_INITIALIZER;
+atomic_t namespace_futex = FUTEX_INITIALIZER;
 
 /**
