Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 72bde81acaa9c2c39b124ad814001c2046dbb66d)
+++ uspace/srv/vfs/vfs_ops.c	(revision 2db4ac8457acaa2a1655dc42d95e27e27dbdc03f)
@@ -48,4 +48,5 @@
 #include <unistd.h>
 #include <ctype.h>
+#include <fcntl.h>
 #include <assert.h>
 #include <atomic.h>
@@ -292,4 +293,9 @@
 	size_t len;
 
+	if (oflag & O_CREAT)
+		lflag |= L_CREATE;
+	if (oflag & O_EXCL)
+		lflag |= L_EXCLUSIVE;
+
 	ipc_callid_t callid;
 
@@ -326,5 +332,8 @@
 	 * triplet.
 	 */
-	rwlock_read_lock(&namespace_rwlock);
+	if (lflag & L_CREATE)
+		rwlock_write_lock(&namespace_rwlock);
+	else
+		rwlock_read_lock(&namespace_rwlock);
 
 	/* The path is now populated and we can call vfs_lookup_internal(). */
@@ -332,5 +341,8 @@
 	rc = vfs_lookup_internal(path, len, lflag, &lr, NULL);
 	if (rc) {
-		rwlock_read_unlock(&namespace_rwlock);
+		if (lflag & L_CREATE)
+			rwlock_write_unlock(&namespace_rwlock);
+		else
+			rwlock_read_unlock(&namespace_rwlock);
 		ipc_answer_0(rid, rc);
 		free(path);
@@ -342,5 +354,8 @@
 
 	vfs_node_t *node = vfs_node_get(&lr);
-	rwlock_read_unlock(&namespace_rwlock);
+	if (lflag & L_CREATE)
+		rwlock_write_unlock(&namespace_rwlock);
+	else
+		rwlock_read_unlock(&namespace_rwlock);
 
 	/*
