Index: uspace/srv/bd/hr/raid1.c
===================================================================
--- uspace/srv/bd/hr/raid1.c	(revision da5c2573ab7873f71a08944e3ac7c0fe455eb6bd)
+++ uspace/srv/bd/hr/raid1.c	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -34,5 +34,4 @@
  */
 
-#include <async.h>
 #include <bd_srv.h>
 #include <block.h>
@@ -146,5 +145,6 @@
 	hr_volume_t *vol = bd->srvs->sarg;
 
-	return block_get_bsize(vol->devs[0], rsize);
+	*rsize = vol->bsize;
+	return EOK;
 }
 
@@ -153,5 +153,6 @@
 	hr_volume_t *vol = bd->srvs->sarg;
 
-	return block_get_nblocks(vol->devs[0], rnb);
+	*rnb = vol->nblocks;
+	return EOK;
 }
 
@@ -160,5 +161,14 @@
 	assert(new_volume->level == hr_l_1);
 
-	errno_t rc;
+	if (new_volume->dev_no < 2) {
+		log_msg(LOG_DEFAULT, LVL_ERROR,
+		    "RAID 1 array needs at least 2 devices");
+		return EINVAL;
+	}
+
+	errno_t rc;
+	size_t i, bsize, last_bsize;
+	uint64_t nblocks, last_nblocks;
+	uint64_t total_blocks = 0;
 
 	rc = hr_init_devs(new_volume);
@@ -166,15 +176,44 @@
 		return rc;
 
+	for (i = 0; i < new_volume->dev_no; i++) {
+		rc = block_get_nblocks(new_volume->devs[i], &nblocks);
+		if (rc != EOK)
+			goto error;
+		if (i != 0 && nblocks != last_nblocks) {
+			log_msg(LOG_DEFAULT, LVL_ERROR,
+			    "number of blocks differs");
+			rc = EINVAL;
+			goto error;
+		}
+		total_blocks += nblocks;
+		last_nblocks = nblocks;
+	}
+
+	for (i = 0; i < new_volume->dev_no; i++) {
+		rc = block_get_bsize(new_volume->devs[i], &bsize);
+		if (rc != EOK)
+			goto error;
+		if (i != 0 && bsize != last_bsize) {
+			log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ");
+			rc = EINVAL;
+			goto error;
+		}
+		last_bsize = bsize;
+	}
+
 	bd_srvs_init(&new_volume->hr_bds);
 	new_volume->hr_bds.ops = &hr_raid1_bd_ops;
 	new_volume->hr_bds.sarg = new_volume;
+	new_volume->nblocks = total_blocks / new_volume->dev_no;
+	new_volume->bsize = bsize;
 
 	rc = hr_register_volume(new_volume);
-	if (rc != EOK) {
-		hr_fini_devs(new_volume);
-		return rc;
-	}
-
-	return EOK;
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	hr_fini_devs(new_volume);
+	return rc;
 }
 
Index: uspace/srv/bd/hr/var.h
===================================================================
--- uspace/srv/bd/hr/var.h	(revision da5c2573ab7873f71a08944e3ac7c0fe455eb6bd)
+++ uspace/srv/bd/hr/var.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -55,4 +55,6 @@
 	char *devname;
 	service_id_t *devs;
+	uint64_t nblocks;
+	size_t bsize;
 	service_id_t svc_id;
 	size_t dev_no;
