Index: uspace/lib/ext4/libext4_bitmap.c
===================================================================
--- uspace/lib/ext4/libext4_bitmap.c	(revision b3d7277fff81fe14acf16f7b50e657379eab157a)
+++ uspace/lib/ext4/libext4_bitmap.c	(revision a9bbce7dae2ba1f933782eb51de851f0dbc15753)
@@ -95,5 +95,5 @@
 }
 
-int ext4_bitmap_free_block(ext4_filesystem_t *fs, uint32_t block_index)
+int ext4_bitmap_free_block(ext4_filesystem_t *fs, ext4_inode_ref_t *inode_ref, uint32_t block_index)
 {
 	int rc;
@@ -102,6 +102,9 @@
 	uint32_t index_in_group;
 	uint32_t bitmap_block;
+	uint32_t block_size;
 	ext4_block_group_ref_t *bg_ref;
 	block_t *block;
+
+	block_size = ext4_superblock_get_block_size(fs->superblock);
 
 	blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
@@ -128,4 +131,9 @@
 		return rc;
 	}
+
+	uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
+	ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE;
+	ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
+	inode_ref->dirty = true;
 
 	uint32_t free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
@@ -138,9 +146,10 @@
 	rc = ext4_filesystem_put_block_group_ref(bg_ref);
 	if (rc != EOK) {
+		EXT4FS_DBG("error in saving bg_ref \%d", rc);
 		// TODO error
 		return rc;
 	}
 
-	EXT4FS_DBG("block \%u released", block_index);
+//	EXT4FS_DBG("block \%u released", block_index);
 
 	return EOK;
@@ -177,12 +186,15 @@
 	rc = ext4_bitmap_find_free_bit_and_set(block->data, &rel_block_idx, block_size);
 	if (rc != EOK) {
-		EXT4FS_DBG("no block found");
-		// TODO if ENOSPC - try next block group - try next block groups
+		EXT4FS_DBG("no free block found");
+		// TODO if ENOSPC - try next block groups
 	}
 
 	block->dirty = true;
 
-	// TODO check retval
-	block_put(block);
+	rc = block_put(block);
+	if (rc != EOK) {
+		// TODO error
+		EXT4FS_DBG("error in saving bitmap \%d", rc);
+	}
 
 	// TODO decrement superblock free blocks count
@@ -191,4 +203,9 @@
 	//ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
 
+	uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
+	ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE;
+	ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
+	inode_ref->dirty = true;
+
 	uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
 	bg_free_blocks--;
@@ -200,5 +217,5 @@
 	blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
 
-	EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1);
+//	EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1);
 
 	*fblock = blocks_per_group * block_group + rel_block_idx + 1;
Index: uspace/lib/ext4/libext4_bitmap.h
===================================================================
--- uspace/lib/ext4/libext4_bitmap.h	(revision b3d7277fff81fe14acf16f7b50e657379eab157a)
+++ uspace/lib/ext4/libext4_bitmap.h	(revision a9bbce7dae2ba1f933782eb51de851f0dbc15753)
@@ -37,5 +37,6 @@
 #include "libext4_filesystem.h"
 
-extern int ext4_bitmap_free_block(ext4_filesystem_t *, uint32_t);
+extern int ext4_bitmap_free_block(ext4_filesystem_t *,
+		ext4_inode_ref_t *, uint32_t);
 extern int ext4_bitmap_alloc_block(ext4_filesystem_t *,
 		ext4_inode_ref_t *, uint32_t *);
Index: uspace/lib/ext4/libext4_filesystem.c
===================================================================
--- uspace/lib/ext4/libext4_filesystem.c	(revision b3d7277fff81fe14acf16f7b50e657379eab157a)
+++ uspace/lib/ext4/libext4_filesystem.c	(revision a9bbce7dae2ba1f933782eb51de851f0dbc15753)
@@ -82,5 +82,5 @@
 	fs->inode_blocks_per_level[0] = 1;
 	for (i = 1; i < 4; i++) {
-		fs->inode_blocks_per_level[i]  = fs->inode_blocks_per_level[i-1] *
+		fs->inode_blocks_per_level[i] = fs->inode_blocks_per_level[i-1] *
 		    block_ids_per_block;
 		fs->inode_block_limits[i] = fs->inode_block_limits[i-1] +
@@ -321,4 +321,9 @@
 	offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
 
+	if (current_block == 0) {
+		*fblock = 0;
+		return EOK;
+	}
+
 	/* Navigate through other levels, until we find the block number
 	 * or find null reference meaning we are dealing with sparse file
@@ -415,6 +420,7 @@
 		if (rc != EOK) {
 			// TODO error
-		}
-		EXT4FS_DBG("AAA: new addr \%u, level = \%u", new_block_addr, level);
+			EXT4FS_DBG("error in allocation");
+		}
+//		EXT4FS_DBG("AAA: new addr \%u, level = \%u", new_block_addr, level);
 
 		ext4_inode_set_indirect_block(inode_ref->inode, level - 1, new_block_addr);
@@ -435,4 +441,6 @@
 			EXT4FS_DBG("block put error");
 		}
+
+//		EXT4FS_DBG("allocated indirect block for level \%u, during setting iblock \%u", level, (uint32_t)iblock);
 
 		current_block = new_block_addr;
@@ -462,4 +470,7 @@
 				if (rc != EOK) {
 					// TODO error
+
+					EXT4FS_DBG("BBB: error block loading");
+
 				}
 				memset(new_block->data, 0, block_size);
@@ -524,5 +535,5 @@
 
 		ext4_inode_set_direct_block(inode, iblock, 0);
-		return ext4_bitmap_free_block(fs, fblock);
+		return ext4_bitmap_free_block(fs, inode_ref, fblock);
 	}
 
@@ -588,5 +599,5 @@
 	}
 
-	return ext4_bitmap_free_block(fs, fblock);
+	return ext4_bitmap_free_block(fs, inode_ref, fblock);
 
 }
Index: uspace/lib/ext4/libext4_inode.h
===================================================================
--- uspace/lib/ext4/libext4_inode.h	(revision b3d7277fff81fe14acf16f7b50e657379eab157a)
+++ uspace/lib/ext4/libext4_inode.h	(revision a9bbce7dae2ba1f933782eb51de851f0dbc15753)
@@ -39,4 +39,5 @@
 #include "libext4_superblock.h"
 
+#define EXT4_INODE_BLOCK_SIZE				512
 
 #define EXT4_INODE_DIRECT_BLOCK_COUNT		12
