Index: uspace/srv/fs/minixfs/mfs_read.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_read.c	(revision c4eeb2f6ef1dbdcbc1f7b589f49649a2f5eadef0)
+++ uspace/srv/fs/minixfs/mfs_read.c	(revision 2d7c77a06b64422a0d568c990d0a23ff038428ff)
@@ -36,7 +36,9 @@
 #include "mfs_utils.h"
 
-static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock);
-
-/*Given the position in the file expressed in
+static int
+rw_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock,
+				bool write_mode, uint32_t w_block);
+
+/**Given the position in the file expressed in
  *bytes, this function returns the on-disk block
  *relative to that position.
@@ -65,10 +67,12 @@
 	}
 
-	r = read_map_ondisk(b, mnode, rblock);
+	r = rw_map_ondisk(b, mnode, rblock, false, 0);
 out:
 	return r;
 }
 
-static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock)
+static int
+rw_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock,
+				bool write_mode, uint32_t w_block)
 {
 	int r, nr_direct;
@@ -78,5 +82,5 @@
 
 	assert(mnode);
-	const struct mfs_ino_info *ino_i = mnode->ino_i;
+	struct mfs_ino_info *ino_i = mnode->ino_i;
 
 	assert(ino_i);
@@ -100,4 +104,8 @@
 	if (rblock < nr_direct) {
 		*b = ino_i->i_dzone[rblock];
+		if (write_mode) {
+			ino_i->i_dzone[rblock] = w_block;
+			ino_i->dirty = true;
+		}
 		r = EOK;
 		goto out;
@@ -118,9 +126,17 @@
 
 		if (fs_version == MFS_VERSION_V1) {
-			uint16_t tmp = ((uint16_t *) bi1->data)[rblock];
-			*b = conv16(sbi->native, tmp);
+			uint16_t *tmp = &(((uint16_t *) bi1->data)[rblock]);
+			*b = conv16(sbi->native, *tmp);
+			if (write_mode) {
+				*tmp = conv16(sbi->native, w_block);
+				bi1->dirty = true;
+			}
 	 	} else {
-			uint32_t tmp = ((uint32_t *) bi1->data)[rblock];
-			*b = conv32(sbi->native, tmp);
+			uint32_t *tmp = &(((uint32_t *) bi1->data)[rblock]);
+			*b = conv32(sbi->native, *tmp);
+			if (write_mode) {
+				*tmp = conv32(sbi->native, w_block);
+				bi1->dirty = true;
+			}
 		}
 
@@ -154,4 +170,5 @@
 		uint16_t *pt16 = bi1->data;
 		uint16_t blk = conv16(sbi->native, pt16[di_block]);
+	
 		r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
 
@@ -160,9 +177,14 @@
 
 		pt16 = bi2->data;
-		blk = conv16(sbi->native, pt16[di_block % ptrs_per_block]);
-		*b = blk;
+		pt16 += di_block % ptrs_per_block;
+		*b = conv16(sbi->native, *pt16);
+		if (write_mode) {
+			*pt16 = conv16(sbi->native, w_block);
+			bi2->dirty = false;
+		}
 	} else {
 		uint32_t *pt32 = bi1->data;
 		uint32_t blk = conv32(sbi->native, pt32[di_block]);
+	
 		r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
 
@@ -171,6 +193,10 @@
 
 		pt32 = bi2->data;
-		blk = conv32(sbi->native, pt32[di_block % ptrs_per_block]);
-		*b = blk;
+		pt32 += di_block % ptrs_per_block;
+		*b = conv32(sbi->native, *pt32);
+		if (write_mode) {
+			*pt32 = conv32(sbi->native, w_block);
+			bi2->dirty = false;
+		}
 	}
 	r = EOK;
