Index: uspace/lib/device/include/vol.h
===================================================================
--- uspace/lib/device/include/vol.h	(revision 4b9213ddfddbd2707165d1dad24b14d20e8320fc)
+++ uspace/lib/device/include/vol.h	(revision 47a12320dedc07bac05596929ea13ab41eb1f58f)
@@ -61,4 +61,5 @@
 extern errno_t vol_pcnt_fs_format(vol_part_cnt_t, vol_fstype_t, char **);
 extern errno_t vol_mountp_validate(const char *);
+extern errno_t vol_part_by_mp(vol_t *, const char *, service_id_t *);
 
 #endif
Index: uspace/lib/device/src/vol.c
===================================================================
--- uspace/lib/device/src/vol.c	(revision 4b9213ddfddbd2707165d1dad24b14d20e8320fc)
+++ uspace/lib/device/src/vol.c	(revision 47a12320dedc07bac05596929ea13ab41eb1f58f)
@@ -608,4 +608,58 @@
 }
 
+/** Find volume by current mount point.
+ *
+ * @param vol Volume service
+ * @param mp Mount point
+ * @param rid Place to store partition service ID
+ * @return EOK on success or an error code
+ */
+errno_t vol_part_by_mp(vol_t *vol, const char *mp, service_id_t *rid)
+{
+	vol_part_info_t vinfo;
+	service_id_t *part_ids = NULL;
+	char *canon_mp_buf = NULL;
+	char *canon_mp;
+	size_t nparts;
+	size_t i;
+	errno_t rc;
+
+	canon_mp_buf = str_dup(mp);
+	if (canon_mp_buf == NULL) {
+		rc = ENOMEM;
+		goto out;
+	}
+
+	canon_mp = vfs_absolutize(canon_mp_buf, NULL);
+	if (canon_mp == NULL) {
+		rc = EINVAL;
+		goto out;
+	}
+
+	rc = vol_get_parts(vol, &part_ids, &nparts);
+	if (rc != EOK)
+		goto out;
+
+	for (i = 0; i < nparts; i++) {
+		rc = vol_part_info(vol, part_ids[i], &vinfo);
+		if (rc != EOK) {
+			rc = EIO;
+			goto out;
+		}
+
+		if (str_cmp(vinfo.cur_mp, canon_mp) == 0) {
+			*rid = part_ids[i];
+			rc = EOK;
+			goto out;
+		}
+	}
+
+	rc = ENOENT;
+out:
+	free(part_ids);
+	free(canon_mp_buf);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/futil/src/futil.c
===================================================================
--- uspace/lib/futil/src/futil.c	(revision 4b9213ddfddbd2707165d1dad24b14d20e8320fc)
+++ uspace/lib/futil/src/futil.c	(revision 47a12320dedc07bac05596929ea13ab41eb1f58f)
@@ -99,7 +99,10 @@
 		return EIO;
 
-	rc = vfs_lookup_open(destp, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE, &df);
-	if (rc != EOK)
-		return EIO;
+	rc = vfs_lookup_open(destp, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE,
+	    &df);
+	if (rc != EOK) {
+		vfs_put(sf);
+		return EIO;
+	}
 
 	do {
@@ -152,17 +155,24 @@
 	de = readdir(dir);
 	while (de != NULL) {
-		if (asprintf(&srcp, "%s/%s", srcdir, de->d_name) < 0)
-			return ENOMEM;
-		if (asprintf(&destp, "%s/%s", destdir, de->d_name) < 0)
-			return ENOMEM;
+		if (asprintf(&srcp, "%s/%s", srcdir, de->d_name) < 0) {
+			rc = ENOMEM;
+			goto error;
+		}
+
+		if (asprintf(&destp, "%s/%s", destdir, de->d_name) < 0) {
+			rc = ENOMEM;
+			goto error;
+		}
 
 		rc = vfs_stat_path(srcp, &s);
 		if (rc != EOK)
-			return EIO;
+			goto error;
 
 		if (s.is_file) {
 			rc = futil_copy_file(futil, srcp, destp);
-			if (rc != EOK)
-				return EIO;
+			if (rc != EOK) {
+				rc = EIO;
+				goto error;
+			}
 		} else if (s.is_directory) {
 			if (futil->cb != NULL && futil->cb->create_dir != NULL)
@@ -170,10 +180,11 @@
 			rc = vfs_link_path(destp, KIND_DIRECTORY, NULL);
 			if (rc != EOK)
-				return EIO;
+				goto error;
 			rc = futil_rcopy_contents(futil, srcp, destp);
 			if (rc != EOK)
-				return EIO;
+				goto error;
 		} else {
-			return EIO;
+			rc = EIO;
+			goto error;
 		}
 
@@ -181,5 +192,9 @@
 	}
 
-	return EOK;
+	closedir(dir);
+	return EOK;
+error:
+	closedir(dir);
+	return rc;
 }
 
