From: "Peter Müller" <peter.mueller@ipfire.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH 3/3] installer: Bind-mount /sys/firmware/efi/efivars into chroot
Date: Wed, 17 Nov 2021 20:11:41 +0000 [thread overview]
Message-ID: <bfbe902d-9f21-badf-1a78-271284c3ccb6@ipfire.org> (raw)
In-Reply-To: <20211104090554.6510-3-michael.tremer@ipfire.org>
[-- Attachment #1: Type: text/plain, Size: 5839 bytes --]
Hello Michael,
lacking C skills, this one looks good to me, but I am not confident enough to tag it as being reviewed.
Acked-by: Peter Müller <peter.mueller(a)ipfire.org>
Thanks, and best regards,
Peter Müller
> Signed-off-by: Michael Tremer <michael.tremer(a)ipfire.org>
> ---
> src/installer/hw.c | 113 +++++++++++++++++++++++++++++--------------
> src/installer/hw.h | 2 +-
> src/installer/main.c | 2 +-
> 3 files changed, 78 insertions(+), 39 deletions(-)
>
> diff --git a/src/installer/hw.c b/src/installer/hw.c
> index 71a1f1cce..265df2d8c 100644
> --- a/src/installer/hw.c
> +++ b/src/installer/hw.c
> @@ -46,13 +46,6 @@
>
> #include "hw.h"
>
> -const char* other_filesystems[] = {
> - "/dev",
> - "/proc",
> - "/sys",
> - NULL
> -};
> -
> static int system_chroot(const char* output, const char* path, const char* cmd) {
> char chroot_cmd[STRING_SIZE];
>
> @@ -149,14 +142,53 @@ int hw_mount(const char* source, const char* target, const char* fs, int flags)
> return mount(source, target, fs, flags, NULL);
> }
>
> -int hw_umount(const char* target) {
> - int r = umount2(target, 0);
> +static int hw_bind_mount(const char* source, const char* prefix) {
> + if (!source || !prefix) {
> + errno = EINVAL;
> + return 1;
> + }
>
> - if (r && errno == EBUSY) {
> - // Give it a moment to settle
> - sleep(1);
> + char target[PATH_MAX];
> + int r;
> +
> + // Format target
> + r = snprintf(target, sizeof(target) - 1, "%s/%s", prefix, source);
> + if (r < 0)
> + return 1;
>
> - r = umount2(target, MNT_FORCE);
> + // Ensure target exists
> + mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
> +
> + return hw_mount(source, target, NULL, MS_BIND);
> +}
> +
> +int hw_umount(const char* source, const char* prefix) {
> + char target[PATH_MAX];
> + int r;
> +
> + if (prefix)
> + r = snprintf(target, sizeof(target) - 1, "%s/%s", prefix, source);
> + else
> + r = snprintf(target, sizeof(target) - 1, "%s", source);
> + if (r < 0)
> + return r;
> +
> + // Perform umount
> + r = umount2(target, 0);
> + if (r) {
> + switch (errno) {
> + // Try again with force if umount wasn't successful
> + case EBUSY:
> + sleep(1);
> +
> + r = umount2(target, MNT_FORCE);
> + break;
> +
> + // target wasn't a mountpoint. Ignore.
> + case EINVAL:
> + r = 0;
> + break;
> + }
> }
>
> return r;
> @@ -174,7 +206,7 @@ static int hw_test_source_medium(const char* path) {
> ret = access(SOURCE_TEST_FILE, R_OK);
>
> // Umount the test device.
> - hw_umount(SOURCE_MOUNT_PATH);
> + hw_umount(SOURCE_MOUNT_PATH, NULL);
>
> return ret;
> }
> @@ -881,20 +913,21 @@ int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
> }
>
> // bind-mount misc filesystems
> - char** otherfs = other_filesystems;
> - while (*otherfs) {
> - snprintf(target, sizeof(target), "%s%s", prefix, *otherfs);
> + r = hw_bind_mount("/dev", prefix);
> + if (r)
> + return r;
>
> - mkdir(target, S_IRWXU|S_IRWXG|S_IRWXO);
> - r = hw_mount(*otherfs, target, NULL, MS_BIND);
> - if (r) {
> - hw_umount_filesystems(dest, prefix);
> + r = hw_bind_mount("/proc", prefix);
> + if (r)
> + return r;
>
> - return r;
> - }
> + r = hw_bind_mount("/sys", prefix);
> + if (r)
> + return r;
>
> - otherfs++;
> - }
> + r = hw_bind_mount("/sys/firmware/efi/efivars", prefix);
> + if (r && errno != ENOENT)
> + return r;
>
> return 0;
> }
> @@ -908,16 +941,14 @@ int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
>
> // ESP
> if (*dest->part_boot_efi) {
> - snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT_EFI);
> - r = hw_umount(target);
> + r = hw_umount(HW_PATH_BOOT_EFI, prefix);
> if (r)
> return -1;
> }
>
> // boot
> if (*dest->part_boot) {
> - snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT);
> - r = hw_umount(target);
> + r = hw_umount(HW_PATH_BOOT, prefix);
> if (r)
> return -1;
> }
> @@ -928,16 +959,24 @@ int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
> }
>
> // misc filesystems
> - char** otherfs = other_filesystems;
> - while (*otherfs) {
> - snprintf(target, sizeof(target), "%s%s", prefix, *otherfs++);
> - r = hw_umount(target);
> - if (r)
> - return -1;
> - }
> + r = hw_umount("/sys/firmware/efi/efivars", prefix);
> + if (r)
> + return -1;
> +
> + r = hw_umount("/sys", prefix);
> + if (r)
> + return -1;
> +
> + r = hw_umount("/proc", prefix);
> + if (r)
> + return -1;
> +
> + r = hw_umount("/dev", prefix);
> + if (r)
> + return -1;
>
> // root
> - r = hw_umount(prefix);
> + r = hw_umount(prefix, NULL);
> if (r)
> return -1;
>
> diff --git a/src/installer/hw.h b/src/installer/hw.h
> index 9fe69271e..b11dfa48f 100644
> --- a/src/installer/hw.h
> +++ b/src/installer/hw.h
> @@ -108,7 +108,7 @@ struct hw* hw_init();
> void hw_free(struct hw* hw);
>
> 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* source, const char* prefix);
>
> char* hw_find_source_medium(struct hw* hw);
>
> diff --git a/src/installer/main.c b/src/installer/main.c
> index bc0fdaa67..fabc0ef52 100644
> --- a/src/installer/main.c
> +++ b/src/installer/main.c
> @@ -909,7 +909,7 @@ int main(int argc, char *argv[]) {
> }
>
> // Umount source drive and eject
> - hw_umount(SOURCE_MOUNT_PATH);
> + hw_umount(SOURCE_MOUNT_PATH, NULL);
>
> // Free downloaded ISO image
> if (strcmp(sourcedrive, SOURCE_TEMPFILE) == 0) {
>
next prev parent reply other threads:[~2021-11-17 20:11 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-04 9:05 [PATCH 1/3] mountkernfs: Mount /sys/firmware/efi/efivars on EFI systems Michael Tremer
2021-11-04 9:05 ` [PATCH 2/3] installer: Setup efivarfs when possible Michael Tremer
2021-11-17 20:09 ` Peter Müller
2021-11-04 9:05 ` [PATCH 3/3] installer: Bind-mount /sys/firmware/efi/efivars into chroot Michael Tremer
2021-11-17 20:11 ` Peter Müller [this message]
2021-11-18 11:09 ` Michael Tremer
2021-11-19 6:30 ` Peter Müller
2021-11-19 11:10 ` Michael Tremer
2021-11-17 20:10 ` [PATCH 1/3] mountkernfs: Mount /sys/firmware/efi/efivars on EFI systems Peter Müller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bfbe902d-9f21-badf-1a78-271284c3ccb6@ipfire.org \
--to=peter.mueller@ipfire.org \
--cc=development@lists.ipfire.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox