Index: uspace/app/sysinst/sysinst.c
===================================================================
--- uspace/app/sysinst/sysinst.c	(revision 11782da4004838b0899c80fba1efa878b8cab87e)
+++ uspace/app/sysinst/sysinst.c	(revision cbaf408fef7cfefd533ecd43ec15ba0fa2a37154)
@@ -73,4 +73,5 @@
 #define DEFAULT_DEV_0 "devices/\\hw\\sys\\00:01.1\\c0d0"
 #define DEFAULT_DEV_1 "devices/\\hw\\sys\\ide1\\c0d0"
+#define DEFAULT_DEV_2 "devices/\\hw\\sys\\00:01.0\\ide1\\c0d0"
 //#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0"
 /** Volume label for the new file system */
@@ -95,4 +96,5 @@
 	DEFAULT_DEV_0,
 	DEFAULT_DEV_1,
+	DEFAULT_DEV_2,
 	NULL
 };
@@ -155,4 +157,5 @@
 static void sysinst_futil_copy_file(void *, const char *, const char *);
 static void sysinst_futil_create_dir(void *, const char *);
+static errno_t sysinst_eject_dev(sysinst_t *, service_id_t);
 
 static futil_cb_t sysinst_futil_cb = {
@@ -424,5 +427,5 @@
 }
 
-/** Label the destination device.
+/** Label and mount the destination device.
  *
  * @param sysinst System installer
@@ -432,12 +435,13 @@
  * @return EOK on success or an error code
  */
-static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev,
-    service_id_t *psvc_id)
-{
-	fdisk_t *fdisk;
-	fdisk_dev_t *fdev;
+static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev)
+{
+	fdisk_t *fdisk = NULL;
+	fdisk_dev_t *fdev = NULL;
 	fdisk_part_t *part;
 	fdisk_part_spec_t pspec;
 	fdisk_part_info_t pinfo;
+	bool dir_created = false;
+	bool label_created = false;
 	capa_spec_t capa;
 	service_id_t sid;
@@ -448,5 +452,5 @@
 	rc = loc_service_get_id(dev, &sid, 0);
 	if (rc != EOK)
-		return rc;
+		goto error;
 
 	sysinst_debug(sysinst, "sysinst_label_dev(): open device");
@@ -455,5 +459,5 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error initializing fdisk.");
-		return rc;
+		goto error;
 	}
 
@@ -461,5 +465,5 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error opening device.");
-		return rc;
+		goto error;
 	}
 
@@ -469,6 +473,8 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error creating mount directory.");
-		return rc;
-	}
+		goto error;
+	}
+
+	dir_created = true;
 
 	sysinst_debug(sysinst, "sysinst_label_dev(): create label");
@@ -477,6 +483,8 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error creating label.");
-		return rc;
-	}
+		goto error;
+	}
+
+	label_created = true;
 
 	sysinst_debug(sysinst, "sysinst_label_dev(): create partition");
@@ -486,5 +494,5 @@
 		sysinst_error(sysinst,
 		    "Error getting available capacity.");
-		return rc;
+		goto error;
 	}
 
@@ -499,5 +507,5 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error creating partition.");
-		return rc;
+		goto error;
 	}
 
@@ -505,9 +513,43 @@
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error getting partition information.");
-		return rc;
+		goto error;
 	}
 
 	sysinst_debug(sysinst, "sysinst_label_dev(): OK");
-	*psvc_id = pinfo.svc_id;
+	fdisk_dev_close(fdev);
+	fdisk_destroy(fdisk);
+	sysinst->psvc_id = pinfo.svc_id;
+	return EOK;
+error:
+	if (label_created)
+		fdisk_label_destroy(fdev);
+	if (dir_created)
+		(void)vfs_unlink_path(MOUNT_POINT);
+	if (fdev != NULL)
+		fdisk_dev_close(fdev);
+	if (fdisk != NULL)
+		fdisk_destroy(fdisk);
+	return rc;
+}
+
+/** Finish/unmount destination device.
+ *
+ * @param sysinst System installer
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t sysinst_finish_dev(sysinst_t *sysinst)
+{
+	errno_t rc;
+
+	sysinst_debug(sysinst, "sysinst_finish_dev(): eject target volume");
+	rc = sysinst_eject_dev(sysinst, sysinst->psvc_id);
+	if (rc != EOK)
+		return rc;
+
+	sysinst_debug(sysinst, "sysinst_finish_dev(): "
+	    "deleting mount directory");
+	(void)vfs_unlink_path(MOUNT_POINT);
+
 	return EOK;
 }
@@ -811,5 +853,5 @@
  *
  * @param sysinst System installer
- * @param psvc_id Partition service ID
+ * @param part_id Partition service ID
  * @return EOK on success or an error code
  */
@@ -825,5 +867,5 @@
 	}
 
-	rc = vol_part_eject(vol, part_id, vef_physical);
+	rc = vol_part_eject(vol, part_id, vef_none);
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error ejecting volume.");
@@ -837,4 +879,44 @@
 }
 
+/** Physically eject volume by mount point.
+ *
+ * @param sysinst System installer
+ * @param path Mount point
+ * @return EOK on success or an error code
+ */
+static errno_t sysinst_eject_phys_by_mp(sysinst_t *sysinst, const char *path)
+{
+	vol_t *vol = NULL;
+	sysarg_t part_id;
+	errno_t rc;
+
+	rc = vol_create(&vol);
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error contacting volume service.");
+		goto out;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_by_mp: mp='%s'\n",
+	    path);
+	rc = vol_part_by_mp(vol, path, &part_id);
+	if (rc != EOK) {
+		sysinst_error(sysinst,
+		    "Error finding installation media mount point.");
+		goto out;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "eject svc_id %lu", (unsigned long)part_id);
+	rc = vol_part_eject(vol, part_id, vef_physical);
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error ejecting volume.");
+		goto out;
+	}
+
+	rc = EOK;
+out:
+	vol_destroy(vol);
+	return rc;
+}
+
 /** Restart the system.
  *
@@ -901,9 +983,8 @@
 {
 	errno_t rc;
-	service_id_t psvc_id;
 
 	sysinst_action(sysinst, "Creating device label and file system.");
 
-	rc = sysinst_label_dev(sysinst, dev, &psvc_id);
+	rc = sysinst_label_dev(sysinst, dev);
 	if (rc != EOK)
 		return rc;
@@ -924,4 +1005,9 @@
 		return rc;
 
+	sysinst_action(sysinst, "Finishing system volume.");
+	rc = sysinst_finish_dev(sysinst);
+	if (rc != EOK)
+		return rc;
+
 	sysinst_action(sysinst, "Installing boot blocks.");
 	rc = sysinst_copy_boot_blocks(sysinst, dev);
@@ -929,6 +1015,6 @@
 		return rc;
 
-	sysinst_action(sysinst, "Ejecting device.");
-	rc = sysinst_eject_dev(sysinst, psvc_id);
+	sysinst_action(sysinst, "Ejecting installation media.");
+	rc = sysinst_eject_phys_by_mp(sysinst, CD_MOUNT_POINT);
 	if (rc != EOK)
 		return rc;
