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 <assert.h>
#include <blkid/blkid.h> #include <blkid/blkid.h>
#include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <libudev.h> #include <libudev.h>
#include <linux/loop.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) { 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) { 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 hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
int r;
char target[STRING_SIZE];
// Write all buffers to disk before umounting // Write all buffers to disk before umounting
hw_sync(); hw_sync();
// boot // boot
if (*dest->part_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 // data
if (*dest->part_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 // swap
if (*dest->part_swap) { if (*dest->part_swap) {
swapoff(dest->part_swap); swapoff(dest->part_swap);
} }
// misc filesystems // misc filesystems
char target[STRING_SIZE];
char** otherfs = other_filesystems; char** otherfs = other_filesystems;
while (*otherfs) { while (*otherfs) {
snprintf(target, sizeof(target), "%s%s", prefix, *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; 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); r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
} }
hw_sync();
return r; return r;
} }

View File

@@ -839,12 +839,28 @@ int main(int argc, char *argv[]) {
free(backup_file); free(backup_file);
} }
// Umount the destination drive // Download and execute the postinstall script
hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH); 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 (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) {
if (destination->is_raid) errorbox(_("Post-install script failed."));
hw_stop_all_raid_arrays(logfile); 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 // Umount source drive and eject
hw_umount(SOURCE_MOUNT_PATH); hw_umount(SOURCE_MOUNT_PATH);
@@ -860,19 +876,18 @@ int main(int argc, char *argv[]) {
snprintf(commandstring, STRING_SIZE, "/usr/bin/eject %s", sourcedrive); snprintf(commandstring, STRING_SIZE, "/usr/bin/eject %s", sourcedrive);
mysystem(logfile, commandstring); mysystem(logfile, commandstring);
} }
newtPopWindow();
// Download and execute the postinstall script // Stop the RAID array if we are using RAID
if (*config.postinstall) { if (destination->is_raid)
snprintf(commandstring, sizeof(commandstring), hw_stop_all_raid_arrays(logfile);
"/usr/bin/execute-postinstall.sh %s %s", DESTINATION_MOUNT_PATH, config.postinstall);
if (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) { // Show a short message that the installation went well and
errorbox(_("Post-install script failed.")); // wait a moment so that all disk caches get flushed.
goto EXIT; 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), _( snprintf(message, sizeof(message), _(
"%s was successfully installed!\n\n" "%s was successfully installed!\n\n"
"Please remove any installation mediums from this system and hit the reboot button. " "Please remove any installation mediums from this system and hit the reboot button. "