Index: uspace/srv/fs/minixfs/mfs_read.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_read.c	(revision 18346ecef18aff5038b28f4285ba8cc82f270b57)
+++ uspace/srv/fs/minixfs/mfs_read.c	(revision 5a29b4c3cadeb6b02d51fe4644c18979144d5ed7)
@@ -40,4 +40,11 @@
 				bool write_mode, uint32_t w_block);
 
+static int
+reset_block_content(struct mfs_instance *inst, uint32_t block);
+
+static int
+alloc_zone_and_clear(struct mfs_instance *inst, uint32_t *block);
+
+
 /**Given the position in the file expressed in
  *bytes, this function returns the on-disk block
@@ -87,6 +94,6 @@
 	assert(mnode->instance);
 
-	const struct mfs_instance *inst = mnode->instance;
-	const struct mfs_sb_info *sbi = inst->sbi;
+	struct mfs_instance *inst = mnode->instance;
+	struct mfs_sb_info *sbi = inst->sbi;
 	assert(sbi);
 
@@ -116,6 +123,16 @@
 		/*The wanted block is in the single indirect zone chain*/
 		if (ino_i->i_izone[0] == 0) {
-			r = -1;
-			goto out;
+			if (write_mode) {
+				uint32_t block;
+				r = alloc_zone_and_clear(inst, &block);
+				if (r != EOK)
+					goto out;
+
+				ino_i->i_izone[0] = block;
+				ino_i->dirty = true;
+			} else {
+				r = -1;
+				goto out;
+			}
 		}
 
@@ -150,6 +167,16 @@
 	/*read the first indirect zone of the chain*/
 	if (ino_i->i_izone[1] == 0) {
-		r = -1;
-		goto out;
+		if (write_mode) {
+			uint32_t block;
+			r = alloc_zone_and_clear(inst, &block);
+			if (r != EOK)
+				goto out;
+
+			ino_i->i_izone[1] = block;
+			ino_i->dirty = true;
+		} else {
+			r = -1;
+			goto out;
+		}
 	}
 
@@ -170,4 +197,20 @@
 		uint16_t *pt16 = bi1->data;
 		uint16_t blk = conv16(sbi->native, pt16[di_block]);
+
+		if (blk == 0) {
+			if (write_mode) {
+				uint32_t block;
+				r = alloc_zone_and_clear(inst, &block);
+				if (r != EOK)
+					goto out;
+
+				blk = block;
+				pt16[di_block] = conv16(sbi->native, blk);
+				bi1->dirty = true;
+			} else {
+				r = 1;
+				goto out;
+			}
+		}
 	
 		r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
@@ -186,4 +229,20 @@
 		uint32_t *pt32 = bi1->data;
 		uint32_t blk = conv32(sbi->native, pt32[di_block]);
+
+		if (blk == 0) {
+			if (write_mode) {
+				uint32_t block;
+				r = alloc_zone_and_clear(inst, &block);
+				if (r != EOK)
+					goto out;
+
+				blk = block;
+				pt32[di_block] = conv32(sbi->native, blk);
+				bi1->dirty = true;
+			} else {
+				r = 1;
+				goto out;
+			}
+		}
 	
 		r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
@@ -209,4 +268,36 @@
 }
 
+
+static int
+reset_block_content(struct mfs_instance *inst, uint32_t block)
+{
+	block_t *b;
+	int r;
+
+	r = block_get(&b, inst->handle, block, BLOCK_FLAGS_NOREAD);
+	if (r != EOK)
+		return r;
+
+	memset(b->data, 0, b->size);
+	b->dirty = true;
+	block_put(b);
+
+	return EOK;
+}
+
+static int
+alloc_zone_and_clear(struct mfs_instance *inst, uint32_t *block)
+{
+	int r;
+
+	r = mfs_alloc_bit(inst, block, BMAP_ZONE);
+	if (r != EOK)
+		goto out;
+
+	r = reset_block_content(inst, *block);
+out:
+	return r;
+}
+
 /**
  * @}
