Index: uspace/app/sysinst/sysinst.c
===================================================================
--- uspace/app/sysinst/sysinst.c	(revision 64ffd83f5f89887b8cfde324d0603dcecba12312)
+++ uspace/app/sysinst/sysinst.c	(revision 498ced18a4f90fe1c9eee028e354d61b39de484d)
@@ -44,8 +44,9 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <str.h>
 #include <str_error.h>
 #include <task.h>
 #include <vfs/vfs.h>
-#include <str.h>
+#include <vol.h>
 
 #include "futil.h"
@@ -63,8 +64,4 @@
 //#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0"
 
-/** Filysystem type. Cannot be changed without building a custom core.img */
-#define FS_TYPE "mfs"
-
-#define FS_SRV "/srv/mfs"
 #define MOUNT_POINT "/inst"
 
@@ -79,9 +76,9 @@
  *
  * @param dev Disk device to label
- * @param pdev Place to store partition device name
+ * @param psvc_id Place to store service ID of the created partition
  *
  * @return EOK on success or an error code
  */
-static errno_t sysinst_label_dev(const char *dev, char **pdev)
+static errno_t sysinst_label_dev(const char *dev, service_id_t *psvc_id)
 {
 	fdisk_t *fdisk;
@@ -89,4 +86,5 @@
 	fdisk_part_t *part;
 	fdisk_part_spec_t pspec;
+	fdisk_part_info_t pinfo;
 	cap_spec_t cap;
 	service_id_t sid;
@@ -111,4 +109,10 @@
 		return rc;
 	}
+
+	printf("sysinst_label_dev(): create mount directory\n");
+
+	rc = vfs_link_path(MOUNT_POINT, KIND_DIRECTORY, NULL);
+	if (rc != EOK)
+		return rc;
 
 	printf("sysinst_label_dev(): create label\n");
@@ -131,6 +135,6 @@
 	pspec.capacity = cap;
 	pspec.pkind = lpk_primary;
-	pspec.fstype = fs_minix;
-	pspec.mountp = "";
+	pspec.fstype = fs_minix; /* Cannot be changed without modifying core.img */
+	pspec.mountp = MOUNT_POINT;
 
 	rc = fdisk_part_create(fdev, &pspec, &part);
@@ -140,49 +144,12 @@
 	}
 
-	/* XXX libfdisk should give us the service name */
-	if (asprintf(pdev, "%sp1", dev) < 0)
-		return ENOMEM;
+	rc = fdisk_part_get_info(part, &pinfo);
+	if (rc != EOK) {
+		printf("Error getting partition information.\n");
+		return rc;
+	}
 
 	printf("sysinst_label_dev(): OK\n");
-	return EOK;
-}
-
-/** Mount target file system.
- *
- * @param dev Partition device
- * @return EOK on success or an error code
- */
-static errno_t sysinst_fs_mount(const char *dev)
-{
-	task_wait_t twait;
-	task_exit_t texit;
-	errno_t rc;
-	int trc;
-
-	printf("sysinst_fs_mount(): start filesystem server\n");
-	rc = task_spawnl(NULL, &twait, FS_SRV, FS_SRV, NULL);
-	if (rc != EOK)
-		return rc;
-
-	printf("sysinst_fs_mount(): wait for filesystem server\n");
-	rc = task_wait(&twait, &texit, &trc);
-	if (rc != EOK)
-		return rc;
-
-	printf("sysinst_fs_mount(): verify filesystem server result\n");
-	if (texit != TASK_EXIT_NORMAL || trc != 0) {
-		printf("sysinst_fs_mount(): not successful, but could be already loaded.\n");
-	}
-
-	rc = vfs_link_path(MOUNT_POINT, KIND_DIRECTORY, NULL);
-	if (rc != EOK)
-		return rc;
-
-	printf("sysinst_fs_mount(): mount filesystem\n");
-	rc = vfs_mount_path(MOUNT_POINT, FS_TYPE, dev, "", 0, 0);
-	if (rc != EOK)
-		return rc;
-
-	printf("sysinst_fs_mount(): OK\n");
+	*psvc_id = pinfo.svc_id;
 	return EOK;
 }
@@ -198,9 +165,4 @@
 	printf("sysinst_copy_boot_files(): copy bootloader files\n");
 	rc = futil_rcopy_contents(BOOT_FILES_SRC, MOUNT_POINT);
-	if (rc != EOK)
-		return rc;
-
-	printf("sysinst_copy_boot_files(): unmount %s\n", MOUNT_POINT);
-	rc = vfs_unmount_path(MOUNT_POINT);
 	if (rc != EOK)
 		return rc;
@@ -321,4 +283,31 @@
 }
 
+/** Eject installation volume.
+ *
+ * @param psvc_id Partition service ID
+ */
+static errno_t sysinst_eject_dev(service_id_t part_id)
+{
+	vol_t *vol = NULL;
+	errno_t rc;
+
+	rc = vol_create(&vol);
+	if (rc != EOK) {
+		printf("Error contacting volume service.\n");
+		goto out;
+	}
+
+	rc = vol_part_eject(vol, part_id);
+	if (rc != EOK) {
+		printf("Error ejecting volume.\n");
+		goto out;
+	}
+
+	rc = EOK;
+out:
+	vol_destroy(vol);
+	return rc;
+}
+
 /** Install system to a device.
  *
@@ -329,16 +318,9 @@
 {
 	errno_t rc;
-	char *pdev;
-
-	rc = sysinst_label_dev(dev, &pdev);
-	if (rc != EOK)
-		return rc;
-
-	printf("Partition '%s'. Mount it.\n", pdev);
-	rc = sysinst_fs_mount(pdev);
-	if (rc != EOK)
-		return rc;
-
-	free(pdev);
+	service_id_t psvc_id;
+
+	rc = sysinst_label_dev(dev, &psvc_id);
+	if (rc != EOK)
+		return rc;
 
 	printf("FS created and mounted. Copying boot files.\n");
@@ -352,4 +334,9 @@
 		return rc;
 
+	printf("Ejecting device.\n");
+	rc = sysinst_eject_dev(psvc_id);
+	if (rc != EOK)
+		return rc;
+
 	return EOK;
 }
