Index: uspace/srv/fs/minixfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_ops.c	(revision 8f6bb76ea8293072b0e8cf2bf9d4983ab11c1024)
+++ uspace/srv/fs/minixfs/mfs_ops.c	(revision 230229de60b82c7e980cab4e0500947fc0256886)
@@ -593,8 +593,6 @@
 
 	if (!async_data_read_receive(&callid, &len)) {
-		mfs_node_put(fn);
-		async_answer_0(callid, EINVAL);
-		async_answer_0(rid, EINVAL);
-		return;
+		rc = EINVAL;
+		goto out_error;
 	}
 
@@ -628,8 +626,59 @@
 				str_size(d_info->d_name) + 1);
 		bytes = ((pos - spos) + 1);
-	}
-
+	} else {
+		struct mfs_sb_info *sbi = mnode->instance->sbi;
+
+		if (pos >= (size_t) ino_i->i_size) {
+			/*Trying to read beyond the end of file*/
+			bytes = 0;
+			(void) async_data_read_finalize(callid, NULL, 0);
+			goto out_success;
+		}
+
+		bytes = min(len, sbi->block_size - pos % sbi->block_size);
+		bytes = min(bytes, ino_i->i_size - pos);
+
+		uint32_t zone;
+		block_t *b;
+
+		rc = read_map(&zone, mnode, pos);
+		if (rc != EOK)
+			goto out_error;
+
+		if (zone == 0) {
+			/*sparse file*/
+			uint8_t *buf = malloc(sbi->block_size);
+			if (!buf) {
+				rc = ENOMEM;
+				goto out_error;
+			}
+			async_data_read_finalize(callid,
+			    buf + pos % sbi->block_size, bytes);
+			free(buf);
+			goto out_success;
+		}
+
+		rc = block_get(&b, handle, zone, BLOCK_FLAGS_NONE);
+		if (rc != EOK)
+			goto out_error;
+
+		async_data_read_finalize(callid, b->data +
+				pos % sbi->block_size, bytes);
+
+		rc = block_put(b);
+		if (rc != EOK) {
+			mfs_node_put(fn);
+			async_answer_0(rid, rc);
+			return;
+		}
+	}
+out_success:
 	rc = mfs_node_put(fn);
 	async_answer_1(rid, rc, (sysarg_t)bytes);
+	return;
+out_error: ;
+	int tmp = mfs_node_put(fn);
+	async_answer_0(callid, tmp != EOK ? tmp : rc);
+	async_answer_0(rid, tmp != EOK ? tmp : rc);
 }
 
