Index: uspace/lib/ext4/src/superblock.c
===================================================================
--- uspace/lib/ext4/src/superblock.c	(revision eff458dc0610e2e236a23436d7688091d3843237)
+++ uspace/lib/ext4/src/superblock.c	(revision cb747b3b787df15184afceecdeef820cfe7e4226)
@@ -1206,4 +1206,6 @@
 errno_t ext4_superblock_write_direct(service_id_t service_id, ext4_superblock_t *sb)
 {
+	void *tmp_sb = sb;
+
 	/* Load physical block size from block device */
 	size_t phys_block_size;
@@ -1216,12 +1218,31 @@
 
 	/* Compute number of block to write */
-	size_t block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size;
-
-	/* Check alignment */
-	if (EXT4_SUPERBLOCK_SIZE % phys_block_size)
-		block_count++;
+	size_t block_count;
+	if (phys_block_size <= EXT4_SUPERBLOCK_SIZE) {
+		block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size;
+		/* Check alignment */
+		if (EXT4_SUPERBLOCK_SIZE % phys_block_size)
+			block_count++;
+	} else {
+		block_count = 1;
+		tmp_sb = malloc(phys_block_size);
+		if (tmp_sb == NULL)
+			return ENOMEM;
+		/* Preserve block data */
+		rc = block_read_direct(service_id, first_block, 1, tmp_sb);
+		if (rc != EOK) {
+			free(tmp_sb);
+			return rc;
+		}
+		void *sb_pos = (uint8_t *)tmp_sb + EXT4_SUPERBLOCK_OFFSET;
+		memcpy(sb_pos, sb, EXT4_SUPERBLOCK_SIZE);
+	}
 
 	/* Write data */
-	return block_write_direct(service_id, first_block, block_count, sb);
+	rc = block_write_direct(service_id, first_block, block_count, tmp_sb);
+
+	if (phys_block_size > EXT4_SUPERBLOCK_SIZE)
+		free(tmp_sb);
+	return rc;
 }
 
