Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 4bf40f637e087cec01fa625a48d7080bccb464cf)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 79d031be78a6f4e5e2744d3ed086c1c93b963b05)
@@ -70,4 +70,6 @@
 #define FAT_DENTRY_DOT		0x2e
 #define FAT_DENTRY_ERASED	0xe5
+
+#define min(a, b)		((a) < (b) ? (a) : (b))
 
 static void dentry_name_canonify(fat_dentry_t *d, char *buf)
@@ -713,4 +715,7 @@
 	off_t pos = (off_t)IPC_GET_ARG3(*request);
 	fat_node_t *nodep = (fat_node_t *)fat_node_get(dev_handle, index);
+	uint16_t bps = fat_bps_get(dev_handle);
+	size_t bytes;
+
 	if (!nodep) {
 		ipc_answer_0(rid, ENOENT);
@@ -728,9 +733,11 @@
 
 	if (nodep->type == FAT_FILE) {
-		/* TODO */
-		fat_node_put(nodep);
-		ipc_answer_0(callid, ENOTSUP);
-		ipc_answer_0(rid, ENOTSUP);
-		return;
+		block_t *b;
+
+		bytes = min(len, bps - pos % bps);
+		b = fat_block_get(nodep, pos / bps);
+		(void) ipc_data_read_finalize(callid, b->data + pos % bps,
+		    bytes);
+		block_put(b);
 	} else {
 		assert(nodep->type == FAT_DIRECTORY);
@@ -743,4 +750,5 @@
 
 	fat_node_put(nodep);
+	ipc_answer_1(rid, EOK, (ipcarg_t)bytes);
 }
 
