Index: uspace/lib/label/src/gpt.c
===================================================================
--- uspace/lib/label/src/gpt.c	(revision 3faa03dd95010d106f2bcc2ad1b10dd7ed86bcff)
+++ uspace/lib/label/src/gpt.c	(revision 6a0d4ce2cd9cedd43adb70b885438b8ebdecc1e5)
@@ -37,4 +37,5 @@
 #include <byteorder.h>
 #include <errno.h>
+#include <mem.h>
 #include <stdlib.h>
 
@@ -46,4 +47,5 @@
 static void gpt_close(label_t *);
 static int gpt_destroy(label_t *);
+static int gpt_get_info(label_t *, label_info_t *);
 static label_part_t *gpt_part_first(label_t *);
 static label_part_t *gpt_part_next(label_part_t *);
@@ -52,5 +54,5 @@
 static int gpt_part_destroy(label_part_t *);
 
-static int gpt_pte_to_part(label_t *, gpt_entry_t *);
+static int gpt_pte_to_part(label_t *, gpt_entry_t *, int);
 
 const uint8_t efi_signature[8] = {
@@ -64,4 +66,5 @@
 	.close = gpt_close,
 	.destroy = gpt_destroy,
+	.get_info = gpt_get_info,
 	.part_first = gpt_part_first,
 	.part_next = gpt_part_next,
@@ -83,4 +86,5 @@
 	uint64_t ba;
 	uint32_t entry;
+	uint64_t ba_min, ba_max;
 	int i;
 	int rc;
@@ -126,4 +130,6 @@
 	bcnt = (num_entries + esize - 1) / esize;
 	ba = uint64_t_le2host(gpt_hdr->entry_lba);
+	ba_min = uint64_t_le2host(gpt_hdr->first_usable_lba);
+	ba_max = uint64_t_le2host(gpt_hdr->last_usable_lba);
 
 	if (num_entries < 1) {
@@ -133,4 +139,9 @@
 
 	if (esize < sizeof(gpt_entry_t)) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	if (ba_max < ba_min) {
 		rc = EINVAL;
 		goto error;
@@ -151,5 +162,5 @@
 	for (entry = 0; entry < num_entries; entry++) {
 		eptr = (gpt_entry_t *)(etable + entry * esize);
-		rc = gpt_pte_to_part(label, eptr);
+		rc = gpt_pte_to_part(label, eptr, entry + 1);
 		if (rc != EOK)
 			goto error;
@@ -163,4 +174,6 @@
 	label->ops = &gpt_label_ops;
 	label->ltype = lt_gpt;
+	label->ablock0 = ba_min;
+	label->anblocks = ba_max - ba_min + 1;
 	*rlabel = label;
 	return EOK;
@@ -187,4 +200,14 @@
 }
 
+static int gpt_get_info(label_t *label, label_info_t *linfo)
+{
+	memset(linfo, 0, sizeof(label_info_t));
+	linfo->dcnt = dc_label;
+	linfo->ltype = lt_gpt;
+	linfo->ablock0 = label->ablock0;
+	linfo->anblocks = label->anblocks;
+	return EOK;
+}
+
 static label_part_t *gpt_part_first(label_t *label)
 {
@@ -211,4 +234,5 @@
 static void gpt_part_get_info(label_part_t *part, label_part_info_t *pinfo)
 {
+	pinfo->index = part->index;
 	pinfo->block0 = part->block0;
 	pinfo->nblocks = part->nblocks;
@@ -218,13 +242,13 @@
     label_part_t **rpart)
 {
-	return EOK;
+	return ENOTSUP;
 }
 
 static int gpt_part_destroy(label_part_t *part)
 {
-	return EOK;
-}
-
-static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte)
+	return ENOTSUP;
+}
+
+static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte, int index)
 {
 	label_part_t *part;
@@ -250,4 +274,5 @@
 		return EINVAL;
 
+	part->index = index;
 	part->block0 = b0;
 	part->nblocks = b1 - b0 + 1;
Index: uspace/lib/label/src/label.c
===================================================================
--- uspace/lib/label/src/label.c	(revision 3faa03dd95010d106f2bcc2ad1b10dd7ed86bcff)
+++ uspace/lib/label/src/label.c	(revision 6a0d4ce2cd9cedd43adb70b885438b8ebdecc1e5)
@@ -97,8 +97,5 @@
 int label_get_info(label_t *label, label_info_t *linfo)
 {
-	memset(linfo, 0, sizeof(label_info_t));
-	linfo->dcnt = dc_label;
-	linfo->ltype = label->ltype;
-	return EOK;
+	return label->ops->get_info(label, linfo);
 }
 
Index: uspace/lib/label/src/mbr.c
===================================================================
--- uspace/lib/label/src/mbr.c	(revision 3faa03dd95010d106f2bcc2ad1b10dd7ed86bcff)
+++ uspace/lib/label/src/mbr.c	(revision 6a0d4ce2cd9cedd43adb70b885438b8ebdecc1e5)
@@ -37,4 +37,5 @@
 #include <byteorder.h>
 #include <errno.h>
+#include <mem.h>
 #include <stdlib.h>
 
@@ -46,4 +47,5 @@
 static void mbr_close(label_t *);
 static int mbr_destroy(label_t *);
+static int mbr_get_info(label_t *, label_info_t *);
 static label_part_t *mbr_part_first(label_t *);
 static label_part_t *mbr_part_next(label_part_t *);
@@ -52,5 +54,5 @@
 static int mbr_part_destroy(label_part_t *);
 
-static int mbr_pte_to_part(label_t *, mbr_pte_t *);
+static int mbr_pte_to_part(label_t *, mbr_pte_t *, int);
 
 label_ops_t mbr_label_ops = {
@@ -59,4 +61,5 @@
 	.close = mbr_close,
 	.destroy = mbr_destroy,
+	.get_info = mbr_get_info,
 	.part_first = mbr_part_first,
 	.part_next = mbr_part_next,
@@ -73,4 +76,5 @@
 	uint16_t sgn;
 	size_t bsize;
+	aoff64_t nblocks;
 	uint32_t entry;
 	int rc;
@@ -82,5 +86,16 @@
 	}
 
+	rc = block_get_nblocks(sid, &nblocks);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
 	if (bsize < 512 || (bsize % 512) != 0) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	if (nblocks < mbr_ablock0) {
 		rc = EINVAL;
 		goto error;
@@ -93,5 +108,5 @@
 	}
 
-	rc = block_read_direct(sid, MBR_BA, 1, mbr);
+	rc = block_read_direct(sid, mbr_ba, 1, mbr);
 	if (rc != EOK) {
 		rc = EIO;
@@ -114,5 +129,5 @@
 	for (entry = 0; entry < mbr_nprimary; entry++) {
 		eptr = &mbr->pte[entry];
-		rc = mbr_pte_to_part(label, eptr);
+		rc = mbr_pte_to_part(label, eptr, entry + 1);
 		if (rc != EOK)
 			goto error;
@@ -124,4 +139,6 @@
 	label->ops = &mbr_label_ops;
 	label->ltype = lt_mbr;
+	label->ablock0 = mbr_ablock0;
+	label->anblocks = nblocks - mbr_ablock0;
 	*rlabel = label;
 	return EOK;
@@ -147,4 +164,14 @@
 }
 
+static int mbr_get_info(label_t *label, label_info_t *linfo)
+{
+	memset(linfo, 0, sizeof(label_info_t));
+	linfo->dcnt = dc_label;
+	linfo->ltype = lt_mbr;
+	linfo->ablock0 = label->ablock0;
+	linfo->anblocks = label->anblocks;
+	return EOK;
+}
+
 static label_part_t *mbr_part_first(label_t *label)
 {
@@ -171,4 +198,5 @@
 static void mbr_part_get_info(label_part_t *part, label_part_info_t *pinfo)
 {
+	pinfo->index = part->index;
 	pinfo->block0 = part->block0;
 	pinfo->nblocks = part->nblocks;
@@ -178,13 +206,13 @@
     label_part_t **rpart)
 {
-	return EOK;
+	return ENOTSUP;
 }
 
 static int mbr_part_destroy(label_part_t *part)
 {
-	return EOK;
-}
-
-static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte)
+	return ENOTSUP;
+}
+
+static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte, int index)
 {
 	label_part_t *part;
@@ -204,4 +232,5 @@
 		return ENOMEM;
 
+	part->index = index;
 	part->block0 = block0;
 	part->nblocks = nblocks;
