Index: uspace/lib/ext4/libext4_balloc.c
===================================================================
--- uspace/lib/ext4/libext4_balloc.c	(revision a159c6aa377c6c5d7c19e1b0e116eb0ae7d48502)
+++ uspace/lib/ext4/libext4_balloc.c	(revision 2f59112756a7b4e140a34a9de2e2150cdffe0fb1)
@@ -91,6 +91,8 @@
 	block_t *bitmap_block;
 	rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
-	if (rc != EOK)
-		return rc;
+	if (rc != EOK) {
+		ext4_filesystem_put_block_group_ref(bg_ref);
+		return rc;
+	}
 	
 	/* Modify bitmap */
@@ -513,6 +515,8 @@
 			bitmap_block->dirty = true;
 			rc = block_put(bitmap_block);
-			if (rc != EOK)
+			if (rc != EOK) {
+				ext4_filesystem_put_block_group_ref(bg_ref);
 				return rc;
+			}
 			
 			allocated_block =
@@ -529,6 +533,8 @@
 			bitmap_block->dirty = true;
 			rc = block_put(bitmap_block);
-			if (rc != EOK)
+			if (rc != EOK) {
+				ext4_filesystem_put_block_group_ref(bg_ref);
 				return rc;
+			}
 			
 			allocated_block =
@@ -600,5 +606,5 @@
     bool *free)
 {
-	int rc = EOK;
+	int rc;
 	
 	ext4_filesystem_t *fs = inode_ref->fs;
@@ -621,6 +627,8 @@
 	block_t *bitmap_block;
 	rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
-	if (rc != EOK)
-		return rc;
+	if (rc != EOK) {
+		ext4_filesystem_put_block_group_ref(bg_ref);
+		return rc;
+	}
 	
 	/* Check if block is free */
Index: uspace/lib/ext4/libext4_ialloc.c
===================================================================
--- uspace/lib/ext4/libext4_ialloc.c	(revision a159c6aa377c6c5d7c19e1b0e116eb0ae7d48502)
+++ uspace/lib/ext4/libext4_ialloc.c	(revision 2f59112756a7b4e140a34a9de2e2150cdffe0fb1)
@@ -204,6 +204,8 @@
 			rc = block_get(&bitmap_block, fs->device, bitmap_block_addr,
 			    BLOCK_FLAGS_NONE);
-			if (rc != EOK)
+			if (rc != EOK) {
+				ext4_filesystem_put_block_group_ref(bg_ref);
 				return rc;
+			}
 			
 			/* Try to allocate i-node in the bitmap */
@@ -225,4 +227,5 @@
 					return rc;
 
+				bgid++;
 				continue;
 			}
@@ -232,6 +235,8 @@
 			
 			rc = block_put(bitmap_block);
-			if (rc != EOK)
+			if (rc != EOK) {
+				ext4_filesystem_put_block_group_ref(bg_ref);
 				return rc;
+			}
 			
 			/* Modify filesystem counters */
Index: uspace/srv/fs/ext4fs/ext4fs_ops.c
===================================================================
--- uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision a159c6aa377c6c5d7c19e1b0e116eb0ae7d48502)
+++ uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision 2f59112756a7b4e140a34a9de2e2150cdffe0fb1)
@@ -1403,14 +1403,16 @@
 	}
 	
-	if (flags == BLOCK_FLAGS_NOREAD)
+	if (flags == BLOCK_FLAGS_NOREAD) {
 		memset(write_block->data, 0, block_size);
+		write_block->dirty = true;
+	}
 
 	rc = async_data_write_finalize(callid, write_block->data +
 	    (pos % block_size), bytes);
-	if (rc != EOK)
+	if (rc != EOK) {
+		block_put(write_block);
 		goto exit;
-
-	write_block->dirty = true;
-	
+	}
+
 	rc = block_put(write_block);
 	if (rc != EOK)
