Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision 663664703394632860eadef65798f751d575e737)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision 11baebb6d23efc311c4c9c9772859860a30c3aa3)
@@ -43,4 +43,5 @@
 #include <stdio.h>
 #include <sys/stat.h>
+#include <sys/statfs.h>
 #include <sys/types.h>
 #include <ipc/services.h>
@@ -892,21 +893,44 @@
 }
 
-int statfs(const char *path, struct statfs *buf)
-{
-	sysarg_t rc;
-	//aid_t req;
-
-	if ( NULL == buf )
-		return 1;
-
-	sysarg_t value;
-	async_exch_t *exch = vfs_exchange_begin();	
-	rc = async_req_0_1(exch, VFS_IN_STATFS, &value);
-	if (rc != EOK)
-		goto exit;
-
-	buf->f_bsize = value;
-exit:
-	vfs_exchange_end(exch);
+#include <stdio.h>
+int statfs(const char *path, struct statfs *statfs)
+{
+	sysarg_t rc;
+	sysarg_t rc_orig;
+	aid_t req;
+	size_t pa_size;
+	
+	char *pa = absolutize(path, &pa_size);
+	if (!pa)
+		return ENOMEM;
+	
+	async_exch_t *exch = vfs_exchange_begin();
+	
+	req = async_send_0(exch, VFS_IN_STATFS, NULL);
+	rc = async_data_write_start(exch, pa, pa_size);
+	if (rc != EOK) {
+		vfs_exchange_end(exch);
+		free(pa);
+		async_wait_for(req, &rc_orig);
+		if (rc_orig == EOK)
+			return (int) rc;
+		else
+			return (int) rc_orig;
+	}
+	printf("TRACE: send VFS_IN_STATFS\n");
+	rc = async_data_read_start(exch, statfs, sizeof(struct statfs));
+	if (rc != EOK) {
+		printf("TRACE: error reply\n");
+		vfs_exchange_end(exch);
+		free(pa);
+		async_wait_for(req, &rc_orig);
+		if (rc_orig == EOK)
+			return (int) rc;
+		else
+			return (int) rc_orig;
+	}
+	vfs_exchange_end(exch);
+	free(pa);
+	async_wait_for(req, &rc);
 	return rc;
 }
