Index: uspace/app/mkext4/mkext4.c
===================================================================
--- uspace/app/mkext4/mkext4.c	(revision c9c1ccd6e4a5eac6e9e07d4f080cc513bd3e46ba)
+++ uspace/app/mkext4/mkext4.c	(revision 4f38ad778b01a722043e92db4cc6d662d2d7d7ec)
@@ -159,4 +159,5 @@
 
 	cfg.volume_name = label;
+	cfg.bsize = 4096;
 	(void) nblocks;
 
Index: uspace/lib/ext4/include/ext4/cfg.h
===================================================================
--- uspace/lib/ext4/include/ext4/cfg.h	(revision c9c1ccd6e4a5eac6e9e07d4f080cc513bd3e46ba)
+++ uspace/lib/ext4/include/ext4/cfg.h	(revision 4f38ad778b01a722043e92db4cc6d662d2d7d7ec)
@@ -53,4 +53,6 @@
 	/** Volume name encoded as UTF-8 string */
 	const char *volume_name;
+	/** Filesystem block size */
+	size_t bsize;
 } ext4_cfg_t;
 
Index: uspace/lib/ext4/src/filesystem.c
===================================================================
--- uspace/lib/ext4/src/filesystem.c	(revision c9c1ccd6e4a5eac6e9e07d4f080cc513bd3e46ba)
+++ uspace/lib/ext4/src/filesystem.c	(revision 4f38ad778b01a722043e92db4cc6d662d2d7d7ec)
@@ -714,6 +714,4 @@
 		/* One for block bitmap one for inode bitmap */
 		free_blocks = free_blocks - reserved - 2 - inode_table_blocks;
-		if (bg_index == 0)
-			++free_blocks; /* XXX Why? */
 
 		ext4_block_group_set_free_blocks_count(bg_ref->block_group,
Index: uspace/lib/ext4/src/superblock.c
===================================================================
--- uspace/lib/ext4/src/superblock.c	(revision c9c1ccd6e4a5eac6e9e07d4f080cc513bd3e46ba)
+++ uspace/lib/ext4/src/superblock.c	(revision 4f38ad778b01a722043e92db4cc6d662d2d7d7ec)
@@ -1315,10 +1315,12 @@
 	    ext4_superblock_get_blocks_per_group(sb);
 	uint64_t total_blocks =
-	    ext4_superblock_get_blocks_count(sb) - 1;
+	    ext4_superblock_get_blocks_count(sb);
+	uint32_t first_block=
+	    ext4_superblock_get_first_data_block(sb);
 
 	if (bgid < block_group_count - 1)
 		return blocks_per_group;
 	else
-		return (total_blocks - ((block_group_count - 1) * blocks_per_group));
+		return (total_blocks - ((block_group_count - 1) * blocks_per_group)) - first_block;
 }
 
@@ -1465,12 +1467,4 @@
 		 */
 
-		if (idx == 0 && block_size == 1024) {
-			/*
-			 * Special case for first group were the boot block
-			 * resides
-			 */
-			r++;
-		}
-
 		/* This accounts for the superblock */
 		r++;
@@ -1505,5 +1499,5 @@
 	uuid_t uuid;
 	uint32_t cur_ts;
-	uint64_t first_block;
+	uint64_t first_block = 0;
 	uint64_t fs_blocks;
 	uint32_t blocks_count;
@@ -1518,4 +1512,5 @@
 	uint32_t idx;
 	size_t fs_bsize;
+	size_t fs_bsize_log;
 	errno_t rc;
 	struct timespec ts;
@@ -1533,6 +1528,22 @@
 	cur_ts = ts.tv_sec;
 
-	fs_bsize = 1024;
-	first_block = 1; /* 1 for 1k block size, 0 otherwise */
+	fs_bsize = cfg->bsize;
+	switch (fs_bsize) {
+		case 1024:
+			first_block = 1;
+			fs_bsize_log = 0;
+			blocks_group = 8192;
+			break;
+		case 2048:
+			fs_bsize_log = 1;
+			blocks_group = 8192 * 2;
+			break;
+		case 4096:
+			fs_bsize_log = 2;
+			blocks_group = 8192 * 4;
+			break;
+		default:
+			return ENOTSUP;
+	}
 
 	if (fs_bsize % dev_bsize == 0) {
@@ -1543,7 +1554,4 @@
 		fs_blocks = dev_bcnt * (dev_bsize / fs_bsize);
 	}
-
-	/* FS blocks per group */
-	blocks_group = 8 * fs_bsize;
 
 	/* Inodes per group */
@@ -1581,8 +1589,7 @@
 	ext4_superblock_set_free_inodes_count(sb, inodes_count);
 	ext4_superblock_set_first_data_block(sb, first_block);
-	/* Block size will be 1024 bytes */
-	ext4_superblock_set_log_block_size(sb, 0);
+	ext4_superblock_set_log_block_size(sb, fs_bsize_log);
 	/* Fragment size should be equal to block size */
-	ext4_superblock_set_log_frag_size(sb, 0);
+	ext4_superblock_set_log_frag_size(sb, fs_bsize_log);
 	ext4_superblock_set_blocks_per_group(sb, blocks_group);
 	/* Should be the same as blocks per group. */
@@ -1634,5 +1641,4 @@
 	/* Compute free blocks */
 	free_blocks = blocks_count;
-	++free_blocks; // XXX Why?
 	for (idx = 0; idx < ngroups; idx++) {
 		free_blocks -= ext4_superblock_get_group_backup_blocks(sb, idx);
