Index: uspace/app/fdisk/fdisk.c
===================================================================
--- uspace/app/fdisk/fdisk.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/app/fdisk/fdisk.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -525,9 +525,9 @@
 	}
 
-	switch (linfo.dcnt) {
-	case dc_empty:
-		printf("Disk is empty.\n");
-		break;
-	case dc_label:
+	switch (linfo.ltype) {
+	case lt_none:
+		printf("Disk contains no label.\n");
+		break;
+	default:
 		rc = fdisk_ltype_format(linfo.ltype, &sltype);
 		if (rc != EOK) {
@@ -540,10 +540,4 @@
 		free(sltype);
 		sltype = NULL;
-		break;
-	case dc_fs:
-		printf("Disk contains a file system.\n");
-		break;
-	case dc_unknown:
-		printf("Disk contains unknown data.\n");
 		break;
 	}
@@ -602,48 +596,46 @@
 	}
 
-	if (linfo.dcnt == dc_label) {
-		if ((linfo.flags & lf_ext_supp) != 0) {
-			if ((linfo.flags & lf_can_create_pri) != 0) {
-				rc = nchoice_add(choice, "Create primary "
-				    "partition",
-				    (void *)devac_create_pri_part);
-				if (rc != EOK) {
-					assert(rc == ENOMEM);
+	if ((linfo.flags & lf_ext_supp) != 0) {
+		if ((linfo.flags & lf_can_create_pri) != 0) {
+			rc = nchoice_add(choice, "Create primary "
+			    "partition",
+			    (void *)devac_create_pri_part);
+			if (rc != EOK) {
+				assert(rc == ENOMEM);
+				printf("Out of memory.\n");
+				goto error;
+			}
+		}
+
+		if ((linfo.flags & lf_can_create_ext) != 0) {
+			rc = nchoice_add(choice, "Create extended "
+			    "partition",
+			    (void *)devac_create_ext_part);
+			if (rc != EOK) {
+				assert(rc == ENOMEM);
+				printf("Out of memory.\n");
+				goto error;
+			}
+		}
+
+		if ((linfo.flags & lf_can_create_log) != 0) {
+			rc = nchoice_add(choice, "Create logical "
+			    "partition",
+			    (void *)devac_create_log_part);
+			if (rc != EOK) {
+				assert(rc == ENOMEM);
+				printf("Out of memory.\n");
+				goto error;
+			}
+		}
+	} else { /* (linfo.flags & lf_ext_supp) == 0 */
+		if ((linfo.flags & lf_can_create_pri) != 0) {
+			rc = nchoice_add(choice, "Create partition",
+			    (void *)devac_create_pri_part);
+			if (rc != EOK) {
+				assert(rc == ENOMEM);
 					printf("Out of memory.\n");
 					goto error;
 				}
-			}
-
-			if ((linfo.flags & lf_can_create_ext) != 0) {
-				rc = nchoice_add(choice, "Create extended "
-				    "partition",
-				    (void *)devac_create_ext_part);
-				if (rc != EOK) {
-					assert(rc == ENOMEM);
-					printf("Out of memory.\n");
-					goto error;
-				}
-			}
-
-			if ((linfo.flags & lf_can_create_log) != 0) {
-				rc = nchoice_add(choice, "Create logical "
-				    "partition",
-				    (void *)devac_create_log_part);
-				if (rc != EOK) {
-					assert(rc == ENOMEM);
-					printf("Out of memory.\n");
-					goto error;
-				}
-			}
-		} else { /* (linfo.flags & lf_ext_supp) == 0 */
-			if ((linfo.flags & lf_can_create_pri) != 0) {
-				rc = nchoice_add(choice, "Create partition",
-				    (void *)devac_create_pri_part);
-				if (rc != EOK) {
-					assert(rc == ENOMEM);
-					printf("Out of memory.\n");
-					goto error;
-				}
-			}
 		}
 	}
@@ -659,5 +651,5 @@
 	}
 
-	if (linfo.dcnt == dc_empty) {
+	if (linfo.ltype == lt_none) {
 		rc = nchoice_add(choice, "Create label",
 		    (void *)devac_create_label);
Index: uspace/lib/c/generic/vol.c
===================================================================
--- uspace/lib/c/generic/vol.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/c/generic/vol.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -192,18 +192,21 @@
 {
 	async_exch_t *exch;
-	sysarg_t dcnt, ltype, flags;
-	int retval;
+	sysarg_t retval;
+	ipc_call_t answer;
 
 	exch = async_exchange_begin(vol->sess);
-	retval = async_req_1_3(exch, VOL_PART_INFO, sid, &dcnt, &ltype,
-	    &flags);
+	aid_t req = async_send_1(exch, VOL_PART_INFO, sid, &answer);
+	int rc = async_data_read_start(exch, vinfo, sizeof(vol_part_info_t));
 	async_exchange_end(exch);
 
+	if (rc != EOK) {
+		async_forget(req);
+		return EIO;
+	}
+
+	async_wait_for(req, &retval);
 	if (retval != EOK)
 		return EIO;
 
-	vinfo->dcnt = (label_disk_cnt_t)dcnt;
-	vinfo->ltype = (label_type_t)ltype;
-	vinfo->flags = (label_flags_t)flags;
 	return EOK;
 }
Index: uspace/lib/c/include/types/label.h
===================================================================
--- uspace/lib/c/include/types/label.h	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/c/include/types/label.h	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -38,15 +38,13 @@
 #include <types/uuid.h>
 
-/** Disk contents */
+/** Partition contents */
 typedef enum {
-	/** Disk is considered empty */
-	dc_empty = 0,
-	/** Disk contains a recognized label */
-	dc_label,
-	/** Disk contains a recognized filesystem */
-	dc_fs,
-	/** Disk contains unrecognized data */
-	dc_unknown
-} label_disk_cnt_t;
+	/** Partition is considered empty */
+	ptc_empty = 0,
+	/** Partition contains a recognized filesystem */
+	ptc_fs,
+	/** Partition contains unrecognized data */
+	ptc_unknown
+} label_part_cnt_t;
 
 /** Disk label type */
Index: uspace/lib/c/include/vol.h
===================================================================
--- uspace/lib/c/include/vol.h	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/c/include/vol.h	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -47,12 +47,27 @@
 } vol_t;
 
+typedef enum {
+	/** Partition is empty */
+	vpc_empty,
+	/** Partition contains a recognized filesystem */
+	vpc_fs,
+	/** Partition contains unrecognized data */
+	vpc_unknown
+} vol_part_cnt_t;
+
+/** File system type */
+typedef enum {
+	fs_exfat,
+	fs_fat,
+	fs_minix,
+	fs_ext4
+} vol_fstype_t;
+
 /** Partition information */
 typedef struct {
-	/** Partition contents */
-	label_disk_cnt_t dcnt;
-	/** Label type, if partition contents is label XXX */
-	label_type_t ltype;
-	/** Label flags */
-	label_flags_t flags;
+	/** Partition content type */
+	vol_part_cnt_t pcnt;
+	/** Filesystem type */
+	vol_fstype_t fstype;
 } vol_part_info_t;
 
Index: uspace/lib/fdisk/include/types/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/types/fdisk.h	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/fdisk/include/types/fdisk.h	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -102,6 +102,4 @@
 	/** Fdisk instance */
 	struct fdisk *fdisk;
-	/** Disk contents */
-	label_disk_cnt_t dcnt;
 	/** Service ID */
 	service_id_t sid;
@@ -123,6 +121,4 @@
 
 typedef struct {
-	/** Disk contents */
-	label_disk_cnt_t dcnt;
 	/** Label type */
 	label_type_t ltype;
Index: uspace/lib/fdisk/src/fdisk.c
===================================================================
--- uspace/lib/fdisk/src/fdisk.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/fdisk/src/fdisk.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -388,6 +388,4 @@
 	}
 
-	dev->dcnt = dc_label;
-
 	printf("get label info\n");
 	rc = fdisk_update_dev_info(dev);
@@ -486,5 +484,4 @@
 	}
 
-	info->dcnt = dc_label;
 	info->ltype = vinfo.ltype;
 	info->flags = vinfo.flags;
@@ -526,5 +523,4 @@
 		return EIO;
 
-	dev->dcnt = dc_empty;
 	return EOK;
 }
Index: uspace/lib/label/include/types/liblabel.h
===================================================================
--- uspace/lib/label/include/types/liblabel.h	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/label/include/types/liblabel.h	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -65,6 +65,4 @@
 
 struct label_info {
-	/** Disk contents */
-	label_disk_cnt_t dcnt;
 	/** Label type */
 	label_type_t ltype;
Index: uspace/lib/label/src/dummy.c
===================================================================
--- uspace/lib/label/src/dummy.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/label/src/dummy.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -157,5 +157,4 @@
 {
 	memset(linfo, 0, sizeof(label_info_t));
-	linfo->dcnt = dc_label;
 	linfo->ltype = lt_none;
 	linfo->flags = 0;
Index: uspace/lib/label/src/gpt.c
===================================================================
--- uspace/lib/label/src/gpt.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/label/src/gpt.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -547,5 +547,4 @@
 {
 	memset(linfo, 0, sizeof(label_info_t));
-	linfo->dcnt = dc_label;
 	linfo->ltype = lt_gpt;
 	linfo->flags = lf_ptype_uuid; /* Partition type is in UUID format */
Index: uspace/lib/label/src/mbr.c
===================================================================
--- uspace/lib/label/src/mbr.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/label/src/mbr.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -402,5 +402,4 @@
 {
 	memset(linfo, 0, sizeof(label_info_t));
-	linfo->dcnt = dc_label;
 	linfo->ltype = lt_mbr;
 
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/srv/volsrv/part.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -113,5 +113,5 @@
 
 	link_initialize(&part->lparts);
-	part->dcnt = dc_empty;
+	part->pcnt = vpc_empty;
 
 	return part;
@@ -149,5 +149,5 @@
 	log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name);
 
-	part->dcnt = dc_unknown;
+	part->pcnt = vpc_unknown;
 	list_append(&part->lparts, &vol_parts);
 
@@ -227,12 +227,13 @@
 int vol_part_empty_part(vol_part_t *part)
 {
-	part->dcnt = dc_empty;
-
-	return EOK;
-}
-
-int vol_part_get_info(vol_part_t *part, vol_part_info_t *dinfo)
-{
-	dinfo->dcnt = part->dcnt;
+	part->pcnt = vpc_empty;
+
+	return EOK;
+}
+
+int vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo)
+{
+	pinfo->pcnt = part->pcnt;
+	pinfo->fstype = part->fstype;
 	return EOK;
 }
Index: uspace/srv/volsrv/types/part.h
===================================================================
--- uspace/srv/volsrv/types/part.h	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/srv/volsrv/types/part.h	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -48,8 +48,8 @@
 	/** Service name */
 	char *svc_name;
-	/** Disk contents */
-	label_disk_cnt_t dcnt;
-	/** Label type */
-	label_type_t ltype;
+	/** Partition contents */
+	vol_part_cnt_t pcnt;
+	/** Filesystem type */
+	vol_fstype_t fstype;
 } vol_part_t;
 
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/srv/volsrv/volsrv.c	(revision 0ecfc62d767bfd2b7b7885ad490d2eb39d4eeb8f)
@@ -40,4 +40,5 @@
 #include <ipc/vol.h>
 #include <loc.h>
+#include <macros.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -135,5 +136,27 @@
 	}
 
-	async_answer_3(iid, rc, pinfo.dcnt, pinfo.ltype, pinfo.flags);
+	ipc_callid_t callid;
+	size_t size;
+	if (!async_data_read_receive(&callid, &size)) {
+		async_answer_0(callid, EREFUSED);
+		async_answer_0(iid, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(vol_part_info_t)) {
+		async_answer_0(callid, EINVAL);
+		async_answer_0(iid, EINVAL);
+		return;
+	}
+
+	rc = async_data_read_finalize(callid, &pinfo,
+	    min(size, sizeof(pinfo)));
+	if (rc != EOK) {
+		async_answer_0(callid, rc);
+		async_answer_0(iid, rc);
+		return;
+	}
+
+	async_answer_0(iid, EOK);
 }
 
