X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=blobdiff_plain;f=src%2Finstaller%2Fhw.c;h=ce9777500d5cbd28ecabdb10082f7fbd04760841;hp=d74526050037e48a1458fa04403430b631903221;hb=ade96ba8a590df6411f7effec637609494072034;hpb=b1c1a589944c88d24cfbc20387d607419e2fb61c 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; }