Index: uspace/lib/c/generic/vfs/vfs.c
===================================================================
--- uspace/lib/c/generic/vfs/vfs.c	(revision bb9ec2db4560230aeb342903a2cb929d99678366)
+++ uspace/lib/c/generic/vfs/vfs.c	(revision a737667eb9d8e74c8717a21d8a1dd6c60dd7d91d)
@@ -1124,29 +1124,33 @@
 int statfs(const char *path, struct statfs *st)
 {
-	sysarg_t rc, rc_orig;
+	size_t pa_size;
+	char *pa = vfs_absolutize(path, &pa_size);
+	if (!pa) {
+		errno = ENOMEM;
+		return -1;
+	}
+	
+	int fd = _vfs_walk(-1, pa, 0);
+	if (fd < 0) {
+		free(pa);
+		errno = fd;
+		return -1;
+	}
+
+	free(pa);
+	
+	sysarg_t rc, ret;
 	aid_t req;
-	size_t pa_size;
-
-	char *pa = vfs_absolutize(path, &pa_size);
-	if (pa == NULL) {
-		errno = ENOMEM;
-		return -1;
-	}
-
-	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)
-		goto exit;
-
+
+	async_exch_t *exch = vfs_exchange_begin();
+
+	req = async_send_1(exch, VFS_IN_STATFS, fd, NULL);
 	rc = async_data_read_start(exch, (void *) st, sizeof(*st));
 
-exit:
-	vfs_exchange_end(exch);
-	free(pa);
-	async_wait_for(req, &rc_orig);
-	rc = (rc_orig != EOK ? rc_orig : rc);
-
+	vfs_exchange_end(exch);
+	async_wait_for(req, &ret);
+	close(fd);
+
+	rc = (ret != EOK ? ret : rc);
 	if (rc != EOK) {
 		errno = rc;
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision bb9ec2db4560230aeb342903a2cb929d99678366)
+++ uspace/srv/vfs/vfs_ops.c	(revision a737667eb9d8e74c8717a21d8a1dd6c60dd7d91d)
@@ -1317,14 +1317,8 @@
 void vfs_statfs(ipc_callid_t rid, ipc_call_t *request)
 {
-	char *path;
-	int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
-	if (rc != EOK) {
-		async_answer_0(rid, rc);
-		return;
-	}
+	int fd = IPC_GET_ARG1(*request);
 	
 	ipc_callid_t callid;
 	if (!async_data_read_receive(&callid, NULL)) {
-		free(path);
 		async_answer_0(callid, EINVAL);
 		async_answer_0(rid, EINVAL);
@@ -1332,23 +1326,11 @@
 	}
 
-	vfs_lookup_res_t lr;
-	fibril_rwlock_read_lock(&namespace_rwlock);
-	rc = vfs_lookup_internal(root, path, L_NONE, &lr);
-	free(path);
-	if (rc != EOK) {
-		fibril_rwlock_read_unlock(&namespace_rwlock);
-		async_answer_0(callid, rc);
-		async_answer_0(rid, rc);
-		return;
-	}
-	vfs_node_t *node = vfs_node_get(&lr);
-	if (!node) {
-		fibril_rwlock_read_unlock(&namespace_rwlock);
-		async_answer_0(callid, ENOMEM);
-		async_answer_0(rid, ENOMEM);
-		return;
-	}
-
-	fibril_rwlock_read_unlock(&namespace_rwlock);
+	vfs_file_t *file = vfs_file_get(fd);
+	if (!file) {
+		async_answer_0(callid, EBADF);
+		async_answer_0(rid, EBADF);
+	}
+
+	vfs_node_t *node = file->node;
 
 	async_exch_t *exch = vfs_exchange_grab(node->fs_handle);
@@ -1364,7 +1346,7 @@
 	async_wait_for(msg, &rv);
 
+	vfs_file_put(file);
+
 	async_answer_0(rid, rv);
-
-	vfs_node_put(node);
 }
 
