Index: uspace/lib/ext4/libext4_bitmap.c
===================================================================
--- uspace/lib/ext4/libext4_bitmap.c	(revision 052e82dfac59bea7c0d7db91b59a859e54aedf73)
+++ uspace/lib/ext4/libext4_bitmap.c	(revision 12b4a7f3cd0106fa01c156269c7f25c868a33bbf)
@@ -33,5 +33,5 @@
 /**
  * @file	libext4_bitmap.c
- * @brief	TODO
+ * @brief	Ext4 bitmap (block & inode) operations.
  */
 
@@ -91,4 +91,5 @@
 	free_blocks++;
 	ext4_block_group_set_free_blocks_count(bg_ref->block_group, free_blocks);
+	bg_ref->dirty = true;
 
 	rc = ext4_filesystem_put_block_group_ref(bg_ref);
Index: uspace/lib/ext4/libext4_block_group.h
===================================================================
--- uspace/lib/ext4/libext4_block_group.h	(revision 052e82dfac59bea7c0d7db91b59a859e54aedf73)
+++ uspace/lib/ext4/libext4_block_group.h	(revision 12b4a7f3cd0106fa01c156269c7f25c868a33bbf)
@@ -65,4 +65,5 @@
 	block_t *block; // Reference to a block containing this block group descr
 	ext4_block_group_t *block_group;
+	bool dirty;
 } ext4_block_group_ref_t;
 
Index: uspace/lib/ext4/libext4_filesystem.c
===================================================================
--- uspace/lib/ext4/libext4_filesystem.c	(revision 052e82dfac59bea7c0d7db91b59a859e54aedf73)
+++ uspace/lib/ext4/libext4_filesystem.c	(revision 12b4a7f3cd0106fa01c156269c7f25c868a33bbf)
@@ -152,6 +152,4 @@
 	}
 
-	//EXT4FS_DBG("desc size = \%u", (uint32_t)ext4_superblock_get_desc_size(fs->superblock));
-
 	descriptors_per_block = ext4_superblock_get_block_size(fs->superblock)
 	    / ext4_superblock_get_desc_size(fs->superblock);
@@ -171,4 +169,5 @@
 
 	newref->block_group = newref->block->data + offset;
+	newref->dirty = false;
 
 	*ref = newref;
@@ -180,4 +179,8 @@
 {
 	int rc;
+
+	if (ref->dirty) {
+		ref->block->dirty = true;
+	}
 
 	rc = block_put(ref->block);
@@ -375,8 +378,8 @@
 	/* TODO handle extents */
 
+
 	/* Handle simple case when we are dealing with direct reference */
 	if (iblock < EXT4_INODE_DIRECT_BLOCK_COUNT) {
-		EXT4FS_DBG("direct block");
-		fblock = ext4_inode_get_direct_block(inode, (uint32_t)iblock);
+		fblock = ext4_inode_get_direct_block(inode, iblock);
 		// Sparse file
 		if (fblock == 0) {
@@ -386,65 +389,65 @@
 		ext4_inode_set_direct_block(inode, iblock, 0);
 		return ext4_bitmap_free_block(fs, fblock);
-	} else {
-
-		/* Determine the indirection level needed to get the desired block */
-		level = -1;
-		for (i = 1; i < 4; i++) {
-			if (iblock < fs->inode_block_limits[i]) {
-				level = i;
-				break;
-			}
-		}
-
-		if (level == -1) {
-			return EIO;
-		}
-
-		/* Compute offsets for the topmost level */
-		block_offset_in_level = iblock - fs->inode_block_limits[level-1];
-		current_block = ext4_inode_get_indirect_block(inode, level-1);
+	}
+
+
+	/* Determine the indirection level needed to get the desired block */
+	level = -1;
+	for (i = 1; i < 4; i++) {
+		if (iblock < fs->inode_block_limits[i]) {
+			level = i;
+			break;
+		}
+	}
+
+	if (level == -1) {
+		return EIO;
+	}
+
+	/* Compute offsets for the topmost level */
+	block_offset_in_level = iblock - fs->inode_block_limits[level-1];
+	current_block = ext4_inode_get_indirect_block(inode, level-1);
+	offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
+
+	/* Navigate through other levels, until we find the block number
+	 * or find null reference meaning we are dealing with sparse file
+	 */
+	while (level > 0) {
+		rc = block_get(&block, fs->device, current_block, 0);
+		if (rc != EOK) {
+			return rc;
+		}
+
+		current_block = uint32_t_le2host(((uint32_t*)block->data)[offset_in_block]);
+
+		// Set zero
+		if (level == 1) {
+			((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(0);
+			block->dirty = true;
+		}
+
+		rc = block_put(block);
+		if (rc != EOK) {
+			return rc;
+		}
+
+		level -= 1;
+
+		/* If we are on the last level, break here as
+		 * there is no next level to visit
+		 */
+		if (level == 0) {
+			break;
+		}
+
+		/* Visit the next level */
+		block_offset_in_level %= fs->inode_blocks_per_level[level];
 		offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
-
-		/* Navigate through other levels, until we find the block number
-		 * or find null reference meaning we are dealing with sparse file
-		 */
-		while (level > 0) {
-			rc = block_get(&block, fs->device, current_block, 0);
-			if (rc != EOK) {
-				return rc;
-			}
-
-			current_block = uint32_t_le2host(((uint32_t*)block->data)[offset_in_block]);
-
-			// Set zero
-			if (level == 1) {
-				((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(0);
-				block->dirty = true;
-			}
-
-			rc = block_put(block);
-			if (rc != EOK) {
-				return rc;
-			}
-
-			level -= 1;
-
-			/* If we are on the last level, break here as
-			 * there is no next level to visit
-			 */
-			if (level == 0) {
-				break;
-			}
-
-			/* Visit the next level */
-			block_offset_in_level %= fs->inode_blocks_per_level[level];
-			offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
-		}
-
-		fblock = current_block;
-
-		if (fblock == 0) {
-			return EOK;
-		}
+	}
+
+	fblock = current_block;
+
+	if (fblock == 0) {
+		return EOK;
 	}
 
Index: uspace/lib/ext4/libext4_inode.c
===================================================================
--- uspace/lib/ext4/libext4_inode.c	(revision 052e82dfac59bea7c0d7db91b59a859e54aedf73)
+++ uspace/lib/ext4/libext4_inode.c	(revision 12b4a7f3cd0106fa01c156269c7f25c868a33bbf)
@@ -193,4 +193,20 @@
 }
 
+bool ext4_inode_can_truncate(ext4_inode_t *inode)
+{
+	 if (ext4_inode_has_flag(inode, EXT4_INODE_FLAG_APPEND)
+			 || ext4_inode_has_flag(inode, EXT4_INODE_FLAG_IMMUTABLE)) {
+		 return false;
+	 }
+
+
+	 if (ext4_inode_get_mode(inode) == EXT4_INODE_MODE_FILE
+			 || ext4_inode_get_mode(inode) == EXT4_INODE_MODE_DIRECTORY) {
+		 return true;
+	 }
+
+	 return false;
+}
+
 /**
  * @}
Index: uspace/lib/ext4/libext4_inode.h
===================================================================
--- uspace/lib/ext4/libext4_inode.h	(revision 052e82dfac59bea7c0d7db91b59a859e54aedf73)
+++ uspace/lib/ext4/libext4_inode.h	(revision 12b4a7f3cd0106fa01c156269c7f25c868a33bbf)
@@ -187,4 +187,5 @@
 extern ext4_extent_header_t * ext4_inode_get_extent_header(ext4_inode_t *);
 extern bool ext4_inode_has_flag(ext4_inode_t *, uint32_t);
+extern bool ext4_inode_can_truncate(ext4_inode_t *);
 
 #endif
