Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision af8ce88009b6e20ac6c1451c117fe7b4601458db)
+++ uspace/srv/fs/minixfs/mfs.h	(revision 2bbbfd3ba262636a35f30ccd28e072952a06939f)
@@ -163,6 +163,14 @@
 put_inode(struct mfs_node *mnode);
 
-/*mfs_read.c*/
-int read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
+/*mfs_rw.c*/
+extern int
+read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
+
+extern int
+write_map(struct mfs_node *mnode, uint32_t pos, uint32_t new_zone,
+				uint32_t *old_zone);
+
+extern int
+free_zone(struct mfs_node *mnode, const uint32_t zone);
 
 /*mfs_dentry.c*/
Index: uspace/srv/fs/minixfs/mfs_rw.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_rw.c	(revision af8ce88009b6e20ac6c1451c117fe7b4601458db)
+++ uspace/srv/fs/minixfs/mfs_rw.c	(revision 2bbbfd3ba262636a35f30ccd28e072952a06939f)
@@ -1,3 +1,4 @@
 /*
+g
  * Copyright (c) 2011 Maurizio Lombardi
  * All rights reserved.
@@ -52,14 +53,9 @@
  *Returns zero if the block does not exist.
  */
-int read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos)
+int
+read_map(uint32_t *b, const struct mfs_node *mnode, uint32_t pos)
 {
 	int r;
-
-	assert(mnode);
-	assert(mnode->instance);
-
 	const struct mfs_sb_info *sbi = mnode->instance->sbi;
-	assert(sbi);
-
 	const int block_size = sbi->block_size;
 
@@ -79,4 +75,33 @@
 }
 
+int
+write_map(struct mfs_node *mnode, const uint32_t pos, uint32_t new_zone, 
+				uint32_t *old_zone)
+{
+	const struct mfs_sb_info *sbi = mnode->instance->sbi;
+	const int block_size = sbi->block_size;
+
+	/*Compute the relative block number in file*/
+	int rblock = pos / block_size;
+
+	return rw_map_ondisk(old_zone, mnode, rblock, true, new_zone);
+}
+
+int
+free_zone(struct mfs_node *mnode, const uint32_t zone)
+{
+	int r;
+	uint32_t old_zone;
+
+	r = rw_map_ondisk(&old_zone, mnode, zone, true, 0);
+	if (r != EOK)
+		return r;
+
+	if (old_zone > 0)
+		mfs_free_bit(mnode->instance, old_zone, BMAP_ZONE);
+
+	return EOK;
+}
+
 static int
 rw_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock,
@@ -98,5 +123,5 @@
 	assert(sbi);
 
-	const int fs_version = sbi->fs_version;
+	const mfs_version_t fs_version = sbi->fs_version;
 
 	if (fs_version == MFS_VERSION_V1) {
@@ -115,6 +140,5 @@
 			ino_i->dirty = true;
 		}
-		r = EOK;
-		goto out;
+		return EOK;
 	}
 	rblock -= nr_direct - 1;
@@ -127,12 +151,10 @@
 				r = alloc_zone_and_clear(inst, &block);
 				if (r != EOK)
-					goto out;
+					return r;
 
 				ino_i->i_izone[0] = block;
 				ino_i->dirty = true;
-			} else {
-				r = -1;
-				goto out;
-			}
+			} else
+				return -1;
 		}
 
@@ -140,5 +162,5 @@
 				BLOCK_FLAGS_NONE);
 		if (r != EOK)
-			goto out;
+			return r;
 
 		if (fs_version == MFS_VERSION_V1) {
@@ -171,19 +193,16 @@
 			r = alloc_zone_and_clear(inst, &block);
 			if (r != EOK)
-				goto out;
+				return r;
 
 			ino_i->i_izone[1] = block;
 			ino_i->dirty = true;
-		} else {
-			r = -1;
-			goto out;
-		}
+		} else
+			return -1;
 	}
 
 	r = block_get(&bi1, inst->handle, ino_i->i_izone[1],
 			BLOCK_FLAGS_NONE);
-
 	if (r != EOK)
-		goto out;
+		return r;
 
 	/*
@@ -203,13 +222,11 @@
 				r = alloc_zone_and_clear(inst, &block);
 				if (r != EOK)
-					goto out;
+					return r;
 
 				blk = block;
 				pt16[ind2_block] = conv16(sbi->native, blk);
 				bi1->dirty = true;
-			} else {
-				r = -1;
-				goto out;
-			}
+			} else
+				return -1;
 		}
 	
@@ -235,13 +252,11 @@
 				r = alloc_zone_and_clear(inst, &block);
 				if (r != EOK)
-					goto out;
+					return r;
 
 				blk = block;
 				pt32[ind2_block] = conv32(sbi->native, blk);
 				bi1->dirty = true;
-			} else {
-				r = -1;
-				goto out;
-			}
+			} else
+				return -1;
 		}
 	
@@ -264,5 +279,4 @@
 out_put_1:
 	block_put(bi1);
-out:
 	return r;
 }
