Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision 286286c5dfab310b2f006338cff4f2898bce1ca2)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision 76a67cea651b8793fab2b3b648c22b0470f02ca3)
@@ -35,4 +35,5 @@
 #include <vfs/canonify.h>
 #include <vfs/vfs.h>
+#include <vfs/vfs_mtab.h>
 #include <vfs/vfs_sess.h>
 #include <macros.h>
@@ -831,4 +832,70 @@
 }
 
+int get_mtab_list(list_t *mtab_list)
+{
+	sysarg_t rc;
+	size_t i;
+	size_t num_mounted_fs;
+	
+	async_exch_t *exch = vfs_exchange_begin();
+
+	rc = async_req_0_0(exch, VFS_IN_GET_MTAB);
+	if (rc != EOK)
+		goto exit;
+
+	/* Ask VFS how many filesystems are mounted */
+	rc = async_req_0_1(exch, VFS_IN_PING, &num_mounted_fs);
+	if (rc != EOK)
+		goto exit;
+
+	for (i = 0; i < num_mounted_fs; ++i) {
+		mtab_list_ent_t *mtab_list_ent;
+		mtab_ent_t *mtab_ent;
+
+		mtab_list_ent = malloc(sizeof(mtab_list_ent_t));
+		if (!mtab_list_ent) {
+			rc = ENOMEM;
+			goto exit;
+		}
+
+		mtab_ent = &mtab_list_ent->mtab_ent;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->mp,
+		    MAX_PATH_LEN);
+		if (rc != EOK)
+			goto exit;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->opts,
+			MAX_MNTOPTS_LEN);
+		if (rc != EOK)
+			goto exit;
+
+		rc = async_data_read_start(exch, (void *) &mtab_ent->fs_name,
+			FS_NAME_MAXLEN);
+		if (rc != EOK)
+			goto exit;
+
+		sysarg_t p[3];
+		int j;
+
+		for (j = 0; j < 3; ++j) {
+			rc = async_req_0_1(exch, VFS_IN_PING, &p[j]);
+			if (rc != EOK)
+				goto exit;
+		}
+
+		mtab_ent->flags = p[0];
+		mtab_ent->instance = p[1];
+		mtab_ent->fs_handle = p[2];
+
+		link_initialize(&mtab_list_ent->link);
+		list_append(&mtab_list_ent->link, mtab_list);
+	}
+
+exit:
+	vfs_exchange_end(exch);
+	return rc;
+}
+
 /** @}
  */
