mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-04-10 11:05:54 +02:00
installer: Fix umounting destination
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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. "
|
||||
|
||||
Reference in New Issue
Block a user