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