]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bootctl: 'graceful' should ignore EFI variable failures
authorKevin P. Fleming <kevin@km6g.us>
Tue, 21 Mar 2023 17:46:08 +0000 (13:46 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 22 Mar 2023 08:16:49 +0000 (09:16 +0100)
Suppress errors when creating/writing EFI variables during 'bootctl update' if
'--graceful' mode is active (as the documentation indicates).

Closes #26773.

src/boot/bootctl-install.c

index 6d356d640fb3f300f92b7515979131dec8cdf2df..617d0abde0268af310a8546e0bbf9c56290a032d 100644 (file)
@@ -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) {