From ade96ba8a590df6411f7effec637609494072034 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 13 Nov 2014 23:58:05 +0100 Subject: [PATCH 1/1] installer: Fix umounting destination --- src/installer/hw.c | 41 ++++++++++++++++++++++++++++++++--------- src/installer/main.c | 43 +++++++++++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/installer/hw.c b/src/installer/hw.c index d745260500..ce9777500d 100644 --- a/src/installer/hw.c +++ b/src/installer/hw.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -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; } diff --git a/src/installer/main.c b/src/installer/main.c index 6e151fbd55..d02db2834a 100644 --- a/src/installer/main.c +++ b/src/installer/main.c @@ -839,12 +839,28 @@ int main(int argc, char *argv[]) { 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); @@ -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. " -- 2.39.2