Index: uspace/srv/bd/hr/superblock.c
===================================================================
--- uspace/srv/bd/hr/superblock.c	(revision baa49290919a649d4090b465f31dc72c6d79b38a)
+++ uspace/srv/bd/hr/superblock.c	(revision a5ec4263bc4f320dbe3328b8e724f3d739c37283)
@@ -83,6 +83,6 @@
 		metadata->index = host2uint32_t_le(i);
 
-		rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF,
-		    HR_META_SIZE, metadata);
+		rc = block_write_direct(vol->extents[i].svc_id,
+		    vol->extents[i].blkno - 1, HR_META_SIZE, metadata);
 		if (rc != EOK)
 			goto error;
@@ -114,6 +114,6 @@
 	metadata->index = host2uint32_t_le(ext);
 
-	rc = block_write_direct(vol->extents[ext].svc_id, HR_META_OFF,
-	    HR_META_SIZE, metadata);
+	rc = block_write_direct(vol->extents[ext].svc_id,
+	    vol->extents[ext].blkno - 1, HR_META_SIZE, metadata);
 	if (rc != EOK)
 		goto error;
@@ -134,5 +134,5 @@
 	HR_DEBUG("%s()", __func__);
 
-	size_t meta_blkno = HR_META_OFF + HR_META_SIZE;
+	size_t meta_blkno = HR_META_SIZE;
 
 	if (vol->level != HR_LVL_1)
@@ -193,4 +193,9 @@
 		assembly_svc_id_order[i] = vol->extents[i].svc_id;
 
+	/*
+	 * XXX: sanitize metadata, for example if truncated_blkno <= extent.blkno
+	 * or bsize == extent.bsize
+	 */
+
 	size_t md_order_indices[HR_MAX_EXTENTS] = { 0 };
 	for (size_t i = 0; i < vol->extent_no; i++) {
@@ -255,4 +260,5 @@
 }
 
+/* XXX: rewrite with read_metadata_block() */
 static errno_t read_metadata(service_id_t dev, hr_metadata_t *metadata)
 {
@@ -264,8 +270,8 @@
 		return rc;
 
-	if (nblocks < HR_META_SIZE + HR_META_OFF)
-		return EINVAL;
-
-	rc = block_read_direct(dev, HR_META_OFF, HR_META_SIZE, metadata);
+	if (nblocks < HR_META_SIZE)
+		return EINVAL;
+
+	rc = block_read_direct(dev, nblocks - 1, HR_META_SIZE, metadata);
 	if (rc != EOK)
 		return rc;
@@ -293,5 +299,5 @@
 		return rc;
 
-	if (blkno < HR_META_OFF + HR_META_SIZE)
+	if (blkno < HR_META_SIZE)
 		return EINVAL;
 
@@ -300,5 +306,5 @@
 		return ENOMEM;
 
-	rc = block_read_direct(dev, HR_META_OFF, HR_META_SIZE, block);
+	rc = block_read_direct(dev, blkno - 1, HR_META_SIZE, block);
 	if (rc != EOK) {
 		free(block);
Index: uspace/srv/bd/hr/superblock.h
===================================================================
--- uspace/srv/bd/hr/superblock.h	(revision baa49290919a649d4090b465f31dc72c6d79b38a)
+++ uspace/srv/bd/hr/superblock.h	(revision a5ec4263bc4f320dbe3328b8e724f3d739c37283)
@@ -39,7 +39,9 @@
 #include "var.h"
 
+/*
+ * Metadata is stored on the last block of an extent.
+ */
 #define HR_META_SIZE		1	/* in blocks */
-#define HR_META_OFF		7	/* in blocks */
-#define HR_DATA_OFF		(HR_META_OFF + HR_META_SIZE)
+#define HR_DATA_OFF		0
 
 #define HR_MAGIC_STR		"HelenRAID"
@@ -75,5 +77,5 @@
 
 	char		devname[HR_DEVNAME_LEN];
-};
+} __attribute__((packed));
 
 extern errno_t	hr_write_meta_to_vol(hr_volume_t *);
