Index: uspace/lib/device/include/hr.h
===================================================================
--- uspace/lib/device/include/hr.h	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/lib/device/include/hr.h	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -69,4 +69,5 @@
 	hr_level_t level;
 	uint64_t nblocks;
+	uint32_t strip_size;
 	size_t bsize;
 } hr_vol_info_t;
Index: uspace/lib/device/src/hr.c
===================================================================
--- uspace/lib/device/src/hr.c	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/lib/device/src/hr.c	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -157,6 +157,17 @@
 
 	printf("level: %d\n", vol_info->level);
-	printf("nblocks: %lu\n", vol_info->nblocks);
-	printf("bsize: %zu\n", vol_info->bsize);
+	if (vol_info->level == hr_l_0) {
+		if (vol_info->strip_size / 1024 < 1)
+			printf("strip size in bytes: %u\n",
+			    vol_info->strip_size);
+		else
+			printf("strip size: %uK\n",
+			    vol_info->strip_size / 1024);
+	}
+	printf("size in bytes: %luMiB\n",
+	    vol_info->nblocks * vol_info->bsize / 1024 / 1024);
+	printf("size in blocks: %lu\n", vol_info->nblocks);
+	printf("block size: %zu\n", vol_info->bsize);
+
 
 	printf("extents: [index] [devname]\n");
Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/srv/bd/hr/hr.c	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -61,5 +61,4 @@
 static service_id_t ctl_sid;
 
-
 static void hr_create_srv(ipc_call_t *icall)
 {
@@ -121,5 +120,109 @@
 		goto error;
 
+	switch (new_volume->level) {
+	case hr_l_1:
+		new_volume->hr_ops.create = hr_raid1_create;
+		new_volume->strip_size = 0;
+		break;
+	case hr_l_0:
+		new_volume->hr_ops.create = hr_raid0_create;
+		new_volume->strip_size = HR_STRIP_SIZE;
+		break;
+	default:
+		log_msg(LOG_DEFAULT, LVL_ERROR,
+		    "level %d not implemented yet", new_volume->level);
+		rc = EINVAL;
+		goto error;
+	}
+
 	rc = hr_write_meta_to_vol(new_volume);
+	if (rc != EOK)
+		goto error;
+
+	rc = new_volume->hr_ops.create(new_volume);
+	if (rc != EOK)
+		goto error;
+
+	fibril_mutex_lock(&hr_volumes_lock);
+	list_append(&new_volume->lvolumes, &hr_volumes);
+	fibril_mutex_unlock(&hr_volumes_lock);
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "created volume \"%s\" (%" PRIun ")",
+	    new_volume->devname, new_volume->svc_id);
+
+	free(cfg);
+	async_answer_0(icall, rc);
+	return;
+error:
+	free(cfg);
+	hr_fini_devs(new_volume);
+	async_answer_0(icall, rc);
+}
+
+static void hr_assemble_srv(ipc_call_t *icall)
+{
+	log_msg(LOG_DEFAULT, LVL_NOTE, "hr_assemble_srv()");
+
+	errno_t rc;
+	size_t size;
+	hr_config_t *cfg;
+	hr_volume_t *new_volume;
+	ipc_call_t call;
+
+	if (!async_data_write_receive(&call, &size)) {
+		async_answer_0(&call, EREFUSED);
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(hr_config_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	cfg = calloc(1, sizeof(hr_config_t));
+	if (cfg == NULL) {
+		async_answer_0(&call, ENOMEM);
+		async_answer_0(icall, ENOMEM);
+		return;
+	}
+
+	rc = async_data_write_finalize(&call, cfg, size);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	new_volume = calloc(1, sizeof(hr_volume_t));
+	if (new_volume == NULL) {
+		free(cfg);
+		async_answer_0(icall, ENOMEM);
+		return;
+	}
+
+	str_cpy(new_volume->devname, 32, cfg->devname);
+	memcpy(new_volume->devs, cfg->devs, sizeof(service_id_t) * HR_MAXDEVS);
+	new_volume->dev_no = cfg->dev_no;
+
+	if (cfg->level != hr_l_empty)
+		log_msg(LOG_DEFAULT, LVL_WARN,
+		    "level manually set when assembling, ingoring");
+
+	new_volume->level = hr_l_empty;
+
+	rc = hr_init_devs(new_volume);
+	if (rc != EOK) {
+		free(cfg);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	rc = hr_check_devs(new_volume);
+	if (rc != EOK)
+		goto error;
+
+	rc = hr_get_vol_from_meta(cfg, new_volume);
 	if (rc != EOK)
 		goto error;
@@ -147,106 +250,4 @@
 	fibril_mutex_unlock(&hr_volumes_lock);
 
-	log_msg(LOG_DEFAULT, LVL_NOTE, "created volume \"%s\" (%" PRIun ")",
-	    new_volume->devname, new_volume->svc_id);
-
-	free(cfg);
-	async_answer_0(icall, rc);
-	return;
-error:
-	free(cfg);
-	hr_fini_devs(new_volume);
-	async_answer_0(icall, rc);
-}
-
-static void hr_assemble_srv(ipc_call_t *icall)
-{
-	log_msg(LOG_DEFAULT, LVL_NOTE, "hr_assemble_srv()");
-
-	errno_t rc;
-	size_t size;
-	hr_config_t *cfg;
-	hr_volume_t *new_volume;
-	ipc_call_t call;
-
-	if (!async_data_write_receive(&call, &size)) {
-		async_answer_0(&call, EREFUSED);
-		async_answer_0(icall, EREFUSED);
-		return;
-	}
-
-	if (size != sizeof(hr_config_t)) {
-		async_answer_0(&call, EINVAL);
-		async_answer_0(icall, EINVAL);
-		return;
-	}
-
-	cfg = calloc(1, sizeof(hr_config_t));
-	if (cfg == NULL) {
-		async_answer_0(&call, ENOMEM);
-		async_answer_0(icall, ENOMEM);
-		return;
-	}
-
-	rc = async_data_write_finalize(&call, cfg, size);
-	if (rc != EOK) {
-		async_answer_0(&call, rc);
-		async_answer_0(icall, rc);
-		return;
-	}
-
-	new_volume = calloc(1, sizeof(hr_volume_t));
-	if (new_volume == NULL) {
-		free(cfg);
-		async_answer_0(icall, ENOMEM);
-		return;
-	}
-
-	str_cpy(new_volume->devname, 32, cfg->devname);
-	memcpy(new_volume->devs, cfg->devs, sizeof(service_id_t) * HR_MAXDEVS);
-	new_volume->dev_no = cfg->dev_no;
-
-	if (cfg->level != hr_l_empty)
-		log_msg(LOG_DEFAULT, LVL_WARN,
-		    "level manually set when assembling, ingoring");
-
-	new_volume->level = hr_l_empty;
-
-	rc = hr_init_devs(new_volume);
-	if (rc != EOK) {
-		free(cfg);
-		async_answer_0(icall, rc);
-		return;
-	}
-
-	rc = hr_check_devs(new_volume);
-	if (rc != EOK)
-		goto error;
-
-	rc = hr_get_vol_from_meta(cfg, new_volume);
-	if (rc != EOK)
-		goto error;
-
-	switch (new_volume->level) {
-	case hr_l_1:
-		new_volume->hr_ops.create = hr_raid1_create;
-		break;
-	case hr_l_0:
-		new_volume->hr_ops.create = hr_raid0_create;
-		break;
-	default:
-		log_msg(LOG_DEFAULT, LVL_ERROR,
-		    "level %d not implemented yet", new_volume->level);
-		rc = EINVAL;
-		goto error;
-	}
-
-	rc = new_volume->hr_ops.create(new_volume);
-	if (rc != EOK)
-		goto error;
-
-	fibril_mutex_lock(&hr_volumes_lock);
-	list_append(&new_volume->lvolumes, &hr_volumes);
-	fibril_mutex_unlock(&hr_volumes_lock);
-
 	log_msg(LOG_DEFAULT, LVL_NOTE, "assembled volume \"%s\" (%" PRIun ")",
 	    new_volume->devname, new_volume->svc_id);
@@ -297,4 +298,5 @@
 		/* print usable number of blocks */
 		info.nblocks = volume->data_blkno;
+		info.strip_size = volume->strip_size;
 		info.bsize = volume->bsize;
 
Index: uspace/srv/bd/hr/raid0.c
===================================================================
--- uspace/srv/bd/hr/raid0.c	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/srv/bd/hr/raid0.c	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -78,5 +78,5 @@
 {
 	uint64_t N = vol->dev_no; /* extents */
-	uint64_t L = HR_STRIP_SIZE / vol->bsize; /* size of strip in blocks */
+	uint64_t L = vol->strip_size / vol->bsize; /* size of strip in blocks */
 
 	uint64_t i = (x / L) % N; /* extent */
Index: uspace/srv/bd/hr/superblock.c
===================================================================
--- uspace/srv/bd/hr/superblock.c	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/srv/bd/hr/superblock.c	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -90,4 +90,5 @@
 	metadata->data_blkno = host2uint64_t_le(data_blkno);
 	metadata->data_offset = host2uint32_t_le(data_offset);
+	metadata->strip_size = host2uint32_t_le(vol->strip_size);
 	for (i = 0; i < vol->dev_no; i++) {
 		metadata->index = host2uint32_t_le(i);
@@ -144,4 +145,5 @@
 	new_volume->data_blkno = uint64_t_le2host(metadata->data_blkno);
 	new_volume->data_offset = uint32_t_le2host(metadata->data_offset);
+	new_volume->strip_size = uint32_t_le2host(metadata->strip_size);
 
 	if (str_cmp(metadata->devname, new_volume->devname) != 0) {
Index: uspace/srv/bd/hr/superblock.h
===================================================================
--- uspace/srv/bd/hr/superblock.h	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/srv/bd/hr/superblock.h	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -49,4 +49,6 @@
 	uint32_t data_offset;	/* block where data starts */
 	uint32_t index;		/* index of disk in array */
+	uint32_t strip_size;
+	uint32_t status;	/* yet unused */
 	uint8_t uuid[16];
 	char devname[32];
Index: uspace/srv/bd/hr/var.h
===================================================================
--- uspace/srv/bd/hr/var.h	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
+++ uspace/srv/bd/hr/var.h	(revision 9c1cf34ca174ca5c556454d53f3356c6c4b957e0)
@@ -60,4 +60,5 @@
 	uint64_t data_blkno;
 	uint32_t data_offset;
+	uint32_t strip_size;
 	service_id_t svc_id;
 	size_t bsize;
