Index: uspace/lib/libc/generic/vfs/vfs.c
===================================================================
--- uspace/lib/libc/generic/vfs/vfs.c	(revision d3e69353929ddbf51ebfe9f5f9ddabbfceeec750)
+++ uspace/lib/libc/generic/vfs/vfs.c	(revision 19b28b0d344a270c38cc8a73ee3b69c0bd45b7fc)
@@ -32,5 +32,5 @@
 /** @file
  */
- 
+
 #include <vfs/vfs.h>
 #include <vfs/canonify.h>
@@ -58,5 +58,5 @@
 DIR *cwd_dir = NULL;
 char *cwd_path = NULL;
-size_t cwd_len = 0; 
+size_t cwd_len = 0;
 
 char *absolutize(const char *path, size_t *retlen)
@@ -110,24 +110,29 @@
 }
 
-static int vfs_connect(void)
-{
-	if (vfs_phone < 0)
-		vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0);
-	return vfs_phone;
-}
-
-static int device_get_handle(const char *name, dev_handle_t *handle)
-{
-	int phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, DEVMAP_CLIENT,
-	    0);
+static void vfs_connect(void)
+{
+	while (vfs_phone < 0)
+		vfs_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_VFS, 0, 0);
+}
+
+static int device_get_handle(const char *name, dev_handle_t *handle,
+    const unsigned int flags)
+{
+	int phone;
+	
+	if (flags & IPC_FLAG_BLOCKING)
+		phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAP, DEVMAP_CLIENT, 0);
+	else
+		phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, DEVMAP_CLIENT, 0);
+	
 	if (phone < 0)
 		return phone;
 	
 	ipc_call_t answer;
-	aid_t req = async_send_2(phone, DEVMAP_DEVICE_GET_HANDLE, 0, 0,
+	aid_t req = async_send_2(phone, DEVMAP_DEVICE_GET_HANDLE, flags, 0,
 	    &answer);
 	
 	ipcarg_t retval = ipc_data_write_start(phone, name, strlen(name) + 1); 
-
+	
 	if (retval != EOK) {
 		async_wait_for(req, NULL);
@@ -135,7 +140,7 @@
 		return retval;
 	}
-
+	
 	async_wait_for(req, &retval);
-
+	
 	if (handle != NULL)
 		*handle = -1;
@@ -150,5 +155,6 @@
 }
 
-int mount(const char *fs_name, const char *mp, const char *dev)
+int mount(const char *fs_name, const char *mp, const char *dev,
+	const unsigned int flags)
 {
 	int res;
@@ -157,5 +163,5 @@
 	dev_handle_t dev_handle;
 	
-	res = device_get_handle(dev, &dev_handle);
+	res = device_get_handle(dev, &dev_handle, flags);
 	if (res != EOK)
 		return res;
@@ -165,18 +171,11 @@
 	if (!mpa)
 		return ENOMEM;
-
-	futex_down(&vfs_phone_futex);
-	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			free(mpa);
-			return res;
-		}
-	}
-	req = async_send_1(vfs_phone, VFS_MOUNT, dev_handle, NULL);
-	rc = ipc_data_write_start(vfs_phone, (void *)fs_name, strlen(fs_name));
+	
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
+	req = async_send_2(vfs_phone, VFS_MOUNT, dev_handle, flags, NULL);
+	rc = ipc_data_write_start(vfs_phone, (void *) mpa, mpa_len);
 	if (rc != EOK) {
 		async_wait_for(req, NULL);
@@ -186,6 +185,6 @@
 		return (int) rc;
 	}
-	/* Ask VFS whether it likes fs_name. */
-	rc = async_req_0_0(vfs_phone, IPC_M_PING);
+	
+	rc = ipc_data_write_start(vfs_phone, (void *) fs_name, strlen(fs_name));
 	if (rc != EOK) {
 		async_wait_for(req, NULL);
@@ -195,16 +194,10 @@
 		return (int) rc;
 	}
-	rc = ipc_data_write_start(vfs_phone, (void *)mpa, mpa_len);
-	if (rc != EOK) {
-		async_wait_for(req, NULL);
-		async_serialize_end();
-		futex_up(&vfs_phone_futex);
-		free(mpa);
-		return (int) rc;
-	}
+	
 	async_wait_for(req, &rc);
 	async_serialize_end();
 	futex_up(&vfs_phone_futex);
 	free(mpa);
+	
 	return (int) rc;
 }
@@ -212,5 +205,4 @@
 static int _open(const char *path, int lflag, int oflag, ...)
 {
-	int res;
 	ipcarg_t rc;
 	ipc_call_t answer;
@@ -224,13 +216,6 @@
 	futex_down(&vfs_phone_futex);
 	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			free(pa);
-			return res;
-		}
-	}
+	vfs_connect();
+	
 	req = async_send_3(vfs_phone, VFS_OPEN, lflag, oflag, 0, &answer);
 	rc = ipc_data_write_start(vfs_phone, pa, pa_len);
@@ -259,20 +244,12 @@
 int close(int fildes)
 {
-	int res;
-	ipcarg_t rc;
-
-	futex_down(&vfs_phone_futex);
-	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			return res;
-		}
-	}
-		
+	ipcarg_t rc;
+	
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
 	rc = async_req_1_0(vfs_phone, VFS_CLOSE, fildes);
-
+	
 	async_serialize_end();
 	futex_up(&vfs_phone_futex);
@@ -283,5 +260,4 @@
 ssize_t read(int fildes, void *buf, size_t nbyte) 
 {
-	int res;
 	ipcarg_t rc;
 	ipc_call_t answer;
@@ -290,12 +266,6 @@
 	futex_down(&vfs_phone_futex);
 	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			return res;
-		}
-	}
+	vfs_connect();
+	
 	req = async_send_1(vfs_phone, VFS_READ, fildes, &answer);
 	rc = ipc_data_read_start(vfs_phone, (void *)buf, nbyte);
@@ -317,5 +287,4 @@
 ssize_t write(int fildes, const void *buf, size_t nbyte) 
 {
-	int res;
 	ipcarg_t rc;
 	ipc_call_t answer;
@@ -324,12 +293,6 @@
 	futex_down(&vfs_phone_futex);
 	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			return res;
-		}
-	}
+	vfs_connect();
+	
 	req = async_send_1(vfs_phone, VFS_WRITE, fildes, &answer);
 	rc = ipc_data_write_start(vfs_phone, (void *)buf, nbyte);
@@ -351,18 +314,10 @@
 off_t lseek(int fildes, off_t offset, int whence)
 {
-	int res;
-	ipcarg_t rc;
-
-	futex_down(&vfs_phone_futex);
-	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			return res;
-		}
-	}
-		
+	ipcarg_t rc;
+
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
 	ipcarg_t newoffs;
 	rc = async_req_3_1(vfs_phone, VFS_SEEK, fildes, offset, whence,
@@ -380,17 +335,10 @@
 int ftruncate(int fildes, off_t length)
 {
-	int res;
-	ipcarg_t rc;
-	
-	futex_down(&vfs_phone_futex);
-	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			return res;
-		}
-	}
+	ipcarg_t rc;
+	
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
 	rc = async_req_2_0(vfs_phone, VFS_TRUNCATE, fildes, length);
 	async_serialize_end();
@@ -434,5 +382,4 @@
 int mkdir(const char *path, mode_t mode)
 {
-	int res;
 	ipcarg_t rc;
 	aid_t req;
@@ -442,16 +389,9 @@
 	if (!pa)
 		return ENOMEM;
-
-	futex_down(&vfs_phone_futex);
-	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			free(pa);
-			return res;
-		}
-	}
+	
+	futex_down(&vfs_phone_futex);
+	async_serialize_start();
+	vfs_connect();
+	
 	req = async_send_1(vfs_phone, VFS_MKDIR, mode, NULL);
 	rc = ipc_data_write_start(vfs_phone, pa, pa_len);
@@ -472,5 +412,4 @@
 static int _unlink(const char *path, int lflag)
 {
-	int res;
 	ipcarg_t rc;
 	aid_t req;
@@ -483,13 +422,6 @@
 	futex_down(&vfs_phone_futex);
 	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			free(pa);
-			return res;
-		}
-	}
+	vfs_connect();
+	
 	req = async_send_0(vfs_phone, VFS_UNLINK, NULL);
 	rc = ipc_data_write_start(vfs_phone, pa, pa_len);
@@ -520,5 +452,4 @@
 int rename(const char *old, const char *new)
 {
-	int res;
 	ipcarg_t rc;
 	aid_t req;
@@ -538,14 +469,6 @@
 	futex_down(&vfs_phone_futex);
 	async_serialize_start();
-	if (vfs_phone < 0) {
-		res = vfs_connect();
-		if (res < 0) {
-			async_serialize_end();
-			futex_up(&vfs_phone_futex);
-			free(olda);
-			free(newa);
-			return res;
-		}
-	}
+	vfs_connect();
+	
 	req = async_send_0(vfs_phone, VFS_RENAME, NULL);
 	rc = ipc_data_write_start(vfs_phone, olda, olda_len);
