Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision ef76d7298e91927da628dd2ad361567d372db2f3)
+++ uspace/srv/fs/minixfs/mfs.h	(revision fde8a2761c41a810605d9c7e27c798b5eb29c579)
@@ -57,4 +57,9 @@
 
 GLOBAL fs_reg_t mfs_reg;
+
+typedef enum {
+	BMAP_ZONE,
+	BMAP_INODE
+} bmap_id_t;
 
 typedef enum {
Index: uspace/srv/fs/minixfs/mfs_read.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_read.c	(revision ef76d7298e91927da628dd2ad361567d372db2f3)
+++ uspace/srv/fs/minixfs/mfs_read.c	(revision fde8a2761c41a810605d9c7e27c798b5eb29c579)
@@ -72,7 +72,8 @@
 static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock)
 {
-	block_t *bi1, *bi2;
 	int r, nr_direct;
 	int ptrs_per_block;
+	uint32_t *bi1 = NULL;
+	uint32_t *bi2 = NULL;
 
 	assert(mnode);
@@ -110,13 +111,14 @@
 		}
 
-		r = read_ind_block(bi2, mnode->instance, ino_i->i_izone[0]);
+		bi1 = (uint32_t *) malloc(sbi->block_size);
+		r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[0],
+					fs_version);
 
-		if (r != EOK)
-			goto out;
+		if (fs_version == MFS_VERSION_V1)
+			*b = ((uint16_t *) bi1)[rblock];
+		else
+			*b = bi1[rblock];
 
-		*b = fs_version == MFS_VERSION_V1 ? 
-				((uint16_t *) bi1->data)[rblock] :
-				((uint32_t *) bi1->data)[rblock];
-		goto out_block;
+		goto out;
 	}
 
@@ -130,5 +132,10 @@
 		goto out;
 	}
-	r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1]);
+
+	bi1 = (uint32_t *) malloc(sbi->block_size);
+	bi2 = (uint32_t *) malloc(sbi->block_size);
+
+	r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1],
+				fs_version);
 
 	if (r != EOK)
@@ -144,25 +151,26 @@
 	if (fs_version == MFS_VERSION_V1) {
 		r = read_ind_block(bi2, mnode->instance,
-			((uint16_t *) bi1->data)[di_block]);
+			((uint16_t *) bi1)[di_block], fs_version);
 
 		if (r != EOK)
-			goto out_block;
+			goto out;
 
-		*b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block];
+		*b = ((uint16_t *) bi2)[rblock % ptrs_per_block];
 	} else {
 		r = read_ind_block(bi2, mnode->instance,
-			((uint32_t *) bi1->data)[di_block]);
+			((uint32_t *) bi1)[di_block], fs_version);
 
 		if (r != EOK)
-			goto out_block;
+			goto out;
 
-		*b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block];
+		*b = bi2[rblock % ptrs_per_block];
 	}
 	r = EOK;
-	block_put(bi2);
 
-out_block:
-	block_put(bi1);
 out:
+	if (bi1)
+		free(bi1);
+	if (bi2)
+		free(bi2);
 	return r;
 }
Index: uspace/srv/fs/minixfs/mfs_utils.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_utils.c	(revision ef76d7298e91927da628dd2ad361567d372db2f3)
+++ uspace/srv/fs/minixfs/mfs_utils.c	(revision fde8a2761c41a810605d9c7e27c798b5eb29c579)
@@ -65,8 +65,13 @@
  *content to the native endian format.
  */
-int read_ind_block(block_t *b, struct mfs_instance *inst, uint32_t block)
+int
+read_ind_block(void *data, struct mfs_instance *inst,
+			uint32_t block, mfs_version_t version)
 {
 	int rc;
 	unsigned i;
+	block_t *b;
+	uint32_t *ptr32;
+	uint16_t *ptr16;
 
 	assert(inst);
@@ -79,19 +84,24 @@
 
 	if (rc != EOK)
-		return rc;
+		goto out;
 
-	if (sbi->fs_version == MFS_VERSION_V1) {
-		uint16_t *pt16 = b->data;
+	if (version == MFS_VERSION_V1) {
+		uint16_t *p = b->data;
+		ptr16 = data;
+		for (i = 0; i < sbi->block_size / sizeof(uint16_t); ++i)
+			ptr16[i] = conv16(sbi->native, p[i]);
+	} else {
+		uint32_t *p = b->data;
+		ptr32 = data;
+		for (i = 0; i < sbi->block_size / sizeof(uint32_t); ++i)
+			ptr32[i] = conv32(sbi->native, p[i]);
 
-		for (i = 0; i < MFS_BLOCKSIZE / sizeof(uint16_t); ++i)
-			pt16[i] = conv16(sbi->native, pt16[i]);
-	} else {
-		uint32_t *pt32 = b->data;
-
-		for (i = 0; i < sbi->block_size / sizeof(uint32_t); ++i)
-			pt32[i] = conv32(sbi->native, pt32[i]);
 	}
 
-	return EOK;
+	rc = EOK;
+
+out:
+	block_put(b);
+	return rc;
 }
 
Index: uspace/srv/fs/minixfs/mfs_utils.h
===================================================================
--- uspace/srv/fs/minixfs/mfs_utils.h	(revision ef76d7298e91927da628dd2ad361567d372db2f3)
+++ uspace/srv/fs/minixfs/mfs_utils.h	(revision fde8a2761c41a810605d9c7e27c798b5eb29c579)
@@ -36,9 +36,18 @@
 #include <sys/types.h>
 #include <bool.h>
+#include "mfs.h"
 
-uint16_t conv16(bool native, uint16_t n);
-uint32_t conv32(bool native, uint32_t n);
-uint64_t conv64(bool native, uint64_t n);
-int read_ind_block(block_t *b, struct mfs_instance *inst, uint32_t block);
+extern uint16_t
+conv16(bool native, uint16_t n);
+
+extern uint32_t
+conv32(bool native, uint32_t n);
+
+extern uint64_t
+conv64(bool native, uint64_t n);
+
+extern int
+read_ind_block(void *data, struct mfs_instance *inst,
+		uint32_t block, mfs_version_t version);
 
 #endif
