#include <assert.h>
#include <blkid/blkid.h>
+#include <errno.h>
#include <fcntl.h>
#include <libudev.h>
#include <linux/loop.h>
}
int hw_umount(const char* target) {
- return umount2(target, 0);
+ int r = umount2(target, 0);
+
+ if (r && errno == EBUSY) {
+ // Give it a moment to settle
+ sleep(1);
+
+ r = umount2(target, MNT_FORCE);
+ }
+
+ return r;
}
static int hw_test_source_medium(const char* path) {
}
int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
+ int r;
+ char target[STRING_SIZE];
+
// Write all buffers to disk before umounting
hw_sync();
// boot
if (*dest->part_boot) {
- hw_umount(dest->part_boot);
+ snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT);
+ r = hw_umount(target);
+ if (r)
+ return -1;
}
// data
if (*dest->part_data) {
- hw_umount(dest->part_data);
+ snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_DATA);
+ r = hw_umount(target);
+ if (r)
+ return -1;
}
- // root
- hw_umount(dest->part_root);
-
// swap
if (*dest->part_swap) {
swapoff(dest->part_swap);
}
// misc filesystems
- char target[STRING_SIZE];
char** otherfs = other_filesystems;
-
while (*otherfs) {
snprintf(target, sizeof(target), "%s%s", prefix, *otherfs++);
- hw_umount(target);
+ r = hw_umount(target);
+ if (r)
+ return -1;
}
+ // root
+ r = hw_umount(prefix);
+ if (r)
+ return -1;
+
return 0;
}
r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
}
+ hw_sync();
+
return r;
}
free(backup_file);
}
+ // Download and execute the postinstall script
+ if (*config.postinstall) {
+ snprintf(commandstring, sizeof(commandstring),
+ "/usr/bin/execute-postinstall.sh %s %s", DESTINATION_MOUNT_PATH, config.postinstall);
+
+ if (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) {
+ errorbox(_("Post-install script failed."));
+ goto EXIT;
+ }
+ }
+
// Umount the destination drive
- hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
+ statuswindow(60, 4, title, _("Umounting filesystems..."));
- // Stop the RAID array if we are using RAID
- if (destination->is_raid)
- hw_stop_all_raid_arrays(logfile);
+ rc = hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
+ if (rc) {
+ // Show an error message if filesystems could not be umounted properly
+ snprintf(message, sizeof(message),
+ _("Could not umount all filesystems successfully:\n\n %s"), strerror(errno));
+ errorbox(message);
+ goto EXIT;
+ }
// Umount source drive and eject
hw_umount(SOURCE_MOUNT_PATH);
snprintf(commandstring, STRING_SIZE, "/usr/bin/eject %s", sourcedrive);
mysystem(logfile, commandstring);
}
+ newtPopWindow();
- // Download and execute the postinstall script
- if (*config.postinstall) {
- snprintf(commandstring, sizeof(commandstring),
- "/usr/bin/execute-postinstall.sh %s %s", DESTINATION_MOUNT_PATH, config.postinstall);
+ // Stop the RAID array if we are using RAID
+ if (destination->is_raid)
+ hw_stop_all_raid_arrays(logfile);
- if (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) {
- errorbox(_("Post-install script failed."));
- goto EXIT;
- }
- }
+ // Show a short message that the installation went well and
+ // wait a moment so that all disk caches get flushed.
+ if (config.unattended) {
+ splashWindow(title, _("Unattended installation has finished. The system will be shutting down in a moment..."), 5);
- if (!config.unattended) {
+ } else {
snprintf(message, sizeof(message), _(
"%s was successfully installed!\n\n"
"Please remove any installation mediums from this system and hit the reboot button. "