installer: Fix umounting destination

This commit is contained in:
Michael Tremer
2014-11-13 23:58:05 +01:00
parent b1c1a58994
commit ade96ba8a5
2 changed files with 62 additions and 24 deletions

View File

@@ -24,6 +24,7 @@
#include <assert.h>
#include <blkid/blkid.h>
#include <errno.h>
#include <fcntl.h>
#include <libudev.h>
#include <linux/loop.h>
@@ -138,7 +139,16 @@ int hw_mount(const char* source, const char* target, const char* fs, int flags)
}
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) {
@@ -869,36 +879,47 @@ int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
}
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;
}
@@ -1012,6 +1033,8 @@ int hw_install_bootloader(struct hw_destination* dest, const char* output) {
r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
}
hw_sync();
return r;
}

View File

@@ -839,12 +839,28 @@ int main(int argc, char *argv[]) {
free(backup_file);
}
// Umount the destination drive
hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
// 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;
}
}
// Umount the destination drive
statuswindow(60, 4, title, _("Umounting filesystems..."));
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);
@@ -860,19 +876,18 @@ int main(int argc, char *argv[]) {
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. "