From: Kevin P. Fleming Date: Tue, 21 Mar 2023 17:46:08 +0000 (-0400) Subject: bootctl: 'graceful' should ignore EFI variable failures X-Git-Tag: v254-rc1~960 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=06d104d58ffa23c958b9b2a2809c61fb25e6f762;p=thirdparty%2Fsystemd.git bootctl: 'graceful' should ignore EFI variable failures Suppress errors when creating/writing EFI variables during 'bootctl update' if '--graceful' mode is active (as the documentation indicates). Closes #26773. --- diff --git a/src/boot/bootctl-install.c b/src/boot/bootctl-install.c index 6d356d640fb..617d0abde02 100644 --- a/src/boot/bootctl-install.c +++ b/src/boot/bootctl-install.c @@ -648,7 +648,8 @@ static int install_variables( uint64_t psize, sd_id128_t uuid, const char *path, - bool first) { + bool first, + bool graceful) { uint16_t slot; int r; @@ -671,18 +672,30 @@ static int install_variables( return log_error_errno(r, "Cannot access \"%s/%s\": %m", esp_path, path); r = find_slot(uuid, path, &slot); - if (r < 0) - return log_error_errno(r, - r == -ENOENT ? - "Failed to access EFI variables. Is the \"efivarfs\" filesystem mounted?" : - "Failed to determine current boot order: %m"); + if (r < 0) { + int level = graceful ? arg_quiet ? LOG_DEBUG : LOG_INFO : LOG_ERR; + const char *skip = graceful ? ", skipping" : ""; + + log_full_errno(level, r, + r == -ENOENT ? + "Failed to access EFI variables%s. Is the \"efivarfs\" filesystem mounted?" : + "Failed to determine current boot order%s: %m", skip); + + return graceful ? 0 : r; + } if (first || r == 0) { r = efi_add_boot_option(slot, pick_efi_boot_option_description(), part, pstart, psize, uuid, path); - if (r < 0) - return log_error_errno(r, "Failed to create EFI Boot variable entry: %m"); + if (r < 0) { + int level = graceful ? arg_quiet ? LOG_DEBUG : LOG_INFO : LOG_ERR; + const char *skip = graceful ? ", skipping" : ""; + + log_full_errno(level, r, "Failed to create EFI Boot variable entry%s: %m", skip); + + return graceful ? 0 : r; + } log_info("Created EFI boot entry \"%s\".", pick_efi_boot_option_description()); } @@ -810,7 +823,7 @@ int verb_install(int argc, char *argv[], void *userdata) { } char *path = strjoina("/EFI/systemd/systemd-boot", arch, ".efi"); - return install_variables(arg_esp_path, part, pstart, psize, uuid, path, install); + return install_variables(arg_esp_path, part, pstart, psize, uuid, path, install, graceful); } static int remove_boot_efi(const char *esp_path) {