Index: uspace/lib/ext4/libext4_extent.c
===================================================================
--- uspace/lib/ext4/libext4_extent.c	(revision 380553c5d065327211ac3b4fc3ada0f8e5d0bb8d)
+++ uspace/lib/ext4/libext4_extent.c	(revision d510ac01958d4700bf385efabc80c465fb7baaa1)
@@ -742,5 +742,4 @@
 		uint32_t iblock)
 {
-	EXT4FS_DBG("iblock = \%u", iblock);
 
 	int rc;
@@ -968,5 +967,5 @@
  */
 int ext4_extent_append_block(ext4_inode_ref_t *inode_ref,
-		uint32_t *iblock, uint32_t *fblock)
+		uint32_t *iblock, uint32_t *fblock, bool update_size)
 {
 	int rc = EOK;
@@ -1026,6 +1025,8 @@
 
 			/* Update i-node */
-			ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
-			inode_ref->dirty = true;
+			if (update_size) {
+				ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
+				inode_ref->dirty = true;
+			}
 
 			path_ptr->block->dirty = true;
@@ -1056,6 +1057,8 @@
 
 			/* Update i-node */
-			ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
-			inode_ref->dirty = true;
+			if (update_size) {
+				ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
+				inode_ref->dirty = true;
+			}
 
 			path_ptr->block->dirty = true;
@@ -1067,10 +1070,4 @@
 /* Append new extent to the tree */
 append_extent:
-
-	/* Append extent for new block (includes tree splitting if needed) */
-	rc = ext4_extent_append_extent(inode_ref, path, &path_ptr, new_block_idx);
-	if (rc != EOK) {
-		goto finish;
-	}
 
 	phys_block = 0;
@@ -1083,4 +1080,11 @@
 	}
 
+	/* Append extent for new block (includes tree splitting if needed) */
+	rc = ext4_extent_append_extent(inode_ref, path, &path_ptr, new_block_idx);
+	if (rc != EOK) {
+		ext4_balloc_free_block(inode_ref, phys_block);
+		goto finish;
+	}
+
 	/* Initialize newly created extent */
 	ext4_extent_set_block_count(path_ptr->extent, 1);
@@ -1089,6 +1093,8 @@
 
 	/* Update i-node */
-	ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
-	inode_ref->dirty = true;
+	if (update_size) {
+		ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
+		inode_ref->dirty = true;
+	}
 
 	path_ptr->block->dirty = true;
Index: uspace/lib/ext4/libext4_extent.h
===================================================================
--- uspace/lib/ext4/libext4_extent.h	(revision 380553c5d065327211ac3b4fc3ada0f8e5d0bb8d)
+++ uspace/lib/ext4/libext4_extent.h	(revision d510ac01958d4700bf385efabc80c465fb7baaa1)
@@ -64,5 +64,5 @@
 extern int ext4_extent_release_blocks_from(ext4_inode_ref_t *, uint32_t);
 
-extern int ext4_extent_append_block(ext4_inode_ref_t *, uint32_t *, uint32_t *);
+extern int ext4_extent_append_block(ext4_inode_ref_t *, uint32_t *, uint32_t *, bool);
 
 #endif
Index: uspace/lib/ext4/libext4_filesystem.c
===================================================================
--- uspace/lib/ext4/libext4_filesystem.c	(revision 380553c5d065327211ac3b4fc3ada0f8e5d0bb8d)
+++ uspace/lib/ext4/libext4_filesystem.c	(revision d510ac01958d4700bf385efabc80c465fb7baaa1)
@@ -1119,5 +1119,5 @@
 			ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS)) {
 
-		return ext4_extent_append_block(inode_ref, iblock, fblock);
+		return ext4_extent_append_block(inode_ref, iblock, fblock, true);
 
 	}
Index: uspace/srv/fs/ext4fs/ext4fs_ops.c
===================================================================
--- uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision 380553c5d065327211ac3b4fc3ada0f8e5d0bb8d)
+++ uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision d510ac01958d4700bf385efabc80c465fb7baaa1)
@@ -1344,7 +1344,7 @@
 				(ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS))) {
 
-			uint32_t tmp_iblock = 0;
-			do {
-				rc = ext4_filesystem_append_inode_block(inode_ref, &fblock, &tmp_iblock);
+			uint32_t last_iblock = ext4_inode_get_size(fs->superblock, inode_ref->inode) / block_size;
+			while (last_iblock < iblock) {
+				rc = ext4_extent_append_block(inode_ref, &last_iblock, &fblock, true);
 				if (rc != EOK) {
 					ext4fs_node_put(fn);
@@ -1352,5 +1352,12 @@
 					return rc;
 				}
-			} while (tmp_iblock < iblock);
+			}
+
+			rc = ext4_extent_append_block(inode_ref, &last_iblock, &fblock, false);
+			if (rc != EOK) {
+				ext4fs_node_put(fn);
+				async_answer_0(callid, rc);
+				return rc;
+			}
 
 		} else {
