Index: uspace/srv/fs/mfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/mfs/mfs_ops.c	(revision 1db44ea7ee4de819d854c7584806a032b665d2a0)
+++ uspace/srv/fs/mfs/mfs_ops.c	(revision 36cb22f7989de9b9af7abf32cfcc1439f618fb10)
@@ -889,6 +889,5 @@
 	struct mfs_ino_info *ino_i = mnode->ino_i;
 	const size_t bs = sbi->block_size;
-	size_t bytes = min(len, bs - pos % bs);
-	size_t boundary = ROUND_UP(ino_i->i_size, bs);
+	size_t bytes = min(len, bs - (pos % bs));
 	uint32_t block;
 
@@ -896,17 +895,10 @@
 		flags = BLOCK_FLAGS_NOREAD;
 
-	if (pos < boundary) {
-		r = mfs_read_map(&block, mnode, pos);
-		if (r != EOK)
-			goto out_err;
-
-		if (block == 0) {
-			/*Writing in a sparse block*/
-			r = mfs_alloc_zone(mnode->instance, &block);
-			if (r != EOK)
-				goto out_err;
-			flags = BLOCK_FLAGS_NOREAD;
-		}
-	} else {
+	r = mfs_read_map(&block, mnode, pos);
+	if (r != EOK)
+		goto out_err;
+
+	if (block == 0) {
+		/*Writing in a sparse block*/
 		uint32_t dummy;
 
@@ -914,8 +906,10 @@
 		if (r != EOK)
 			goto out_err;
-
+		
 		r = mfs_write_map(mnode, pos, block, &dummy);
 		if (r != EOK)
 			goto out_err;
+
+		flags = BLOCK_FLAGS_NOREAD;
 	}
 
@@ -925,5 +919,8 @@
 		goto out_err;
 
-	async_data_write_finalize(callid, b->data + pos % bs, bytes);
+	if (flags == BLOCK_FLAGS_NOREAD)
+		memset(b->data, 0, sbi->block_size);
+
+	async_data_write_finalize(callid, b->data + (pos % bs), bytes);
 	b->dirty = true;
 
@@ -934,8 +931,10 @@
 	}
 
-	ino_i->i_size = pos + bytes;
-	ino_i->dirty = true;
+	if (pos + bytes > ino_i->i_size) {
+		ino_i->i_size = pos + bytes;
+		ino_i->dirty = true;
+	}
 	r = mfs_node_put(fn);
-	*nsize = pos + bytes;
+	*nsize = ino_i->i_size;
 	*wbytes = bytes;
 	return r;
Index: uspace/srv/fs/mfs/mfs_rw.c
===================================================================
--- uspace/srv/fs/mfs/mfs_rw.c	(revision 1db44ea7ee4de819d854c7584806a032b665d2a0)
+++ uspace/srv/fs/mfs/mfs_rw.c	(revision 36cb22f7989de9b9af7abf32cfcc1439f618fb10)
@@ -31,4 +31,5 @@
  */
 
+#include <align.h>
 #include "mfs.h"
 
@@ -70,5 +71,5 @@
 	int rblock = pos / block_size;
 
-	if (mnode->ino_i->i_size < pos) {
+	if (ROUND_UP(mnode->ino_i->i_size, sbi->block_size) < pos) {
 		/*Trying to read beyond the end of file*/
 		r = EOK;
